package cc150.thread_lock;

public class RunnableThreadExample implements Runnable{

	public int count = 0;

	public static void main(String[] args) {
// TODO 自动生成的方法存根
RunnableThreadExample instance = new RunnableThreadExample();
Thread thread = new Thread(instance);
thread.start();
//等到上面的线程数到5
while(instance.count != 5){
try{
Thread.sleep(250);
System.out.println("等待");
}catch(InterruptedException exc){
exc.printStackTrace();
}
}
} @Override
public void run() {
// TODO 自动生成的方法存根
System.out.println("RunnableThread开始");
try{
while(count < 5){
Thread.sleep(500);
count++;
}
}catch(InterruptedException exc){
System.out.println("RunnableThread中断");
}
System.out.println("RunnableThread终止");
} }

package cc150.thread_lock;

public class ThreadExample{

	public static void main(String[] args){
// TODO 自动生成的方法存根
ThreadExample th = new ThreadExample();
threadExample instance = th.new threadExample();
instance.start();
//等到上面的线程数到5
while(instance.count != 5){
try{
Thread.sleep(250);
System.out.println("等待");
}catch(InterruptedException exc){
exc.printStackTrace();
}
}
} public class threadExample extends Thread{
int count = 0;
public void run() {
// TODO 自动生成的方法存根
System.out.println("Thread开始");
try{
while(count < 5){
Thread.sleep(500);
System.out.println("在线程中,count是"+count);
count++;
}
}catch(InterruptedException exc){
System.out.println("RunnableThread中断");
}
System.out.println("RunnableThread终止");
}
}
}

package cc150.thread_lock;

class MyObject{
public synchronized void foo(String name){ //加上synchronized关键字,给foo提供同步
try{
System.out.println("线程"+name+".foo()开始");
Thread.sleep(3000);
System.out.println("线程"+name+".foo()结束");
}catch(InterruptedException exc){
System.out.println("线程"+name+"中断");
}
}
} public class MyClass extends Thread{ //不同的线程,来调用上面的foo private String name;
private MyObject myObj; public MyClass(MyObject obj,String n){
name = n;
myObj = obj;
} public void run(){
myObj.foo(name);
} public static void main(String[] args) {
// TODO 自动生成的方法存根
// MyObject obj1 = new MyObject();
// MyObject obj2 = new MyObject();
// MyClass thread1 = new MyClass(obj1,"1");
// MyClass thread2 = new MyClass(obj2,"2");
// thread1.start();
// thread2.start(); //相同的obj引用,只能一个线程可以调用foo,另一个线程必须等待
MyObject obj = new MyObject();
MyClass thread11 = new MyClass(obj,"1");
MyClass thread22 = new MyClass(obj,"2");
thread11.start();
thread22.start();
} }

package cc150.thread_lock;

class MyObject{
public static synchronized void foo(String name){ //加上synchronized关键字,给foo提供同步
try{
System.out.println("线程"+name+".foo()开始");
Thread.sleep(3000);
System.out.println("线程"+name+".foo()结束");
}catch(InterruptedException exc){
System.out.println("线程"+name+"中断");
}
} public static synchronized void bar(String name){ //加上synchronized关键字,给bar提供同步
try{
System.out.println("线程"+name+".bar()开始");
Thread.sleep(3000);
System.out.println("线程"+name+".bar()结束");
}catch(InterruptedException exc){
System.out.println("线程"+name+"中断");
}
}
} public class MyClass extends Thread{ //不同的线程,来调用上面的foo private String name;
private MyObject myObj; public MyClass(MyObject obj,String n){
name = n;
myObj = obj;
} public void run(){
//myObj.foo(name);
if(name.equals("1"))
MyObject.foo(name);
else if(name.equals("2"))
MyObject.bar(name);
} public static void main(String[] args) {
// TODO 自动生成的方法存根
// MyObject obj1 = new MyObject();
// MyObject obj2 = new MyObject();
// MyClass thread1 = new MyClass(obj1,"1");
// MyClass thread2 = new MyClass(obj2,"2");
// thread1.start();
// thread2.start(); //相同的obj引用,只能一个线程可以调用foo,另一个线程必须等待
MyObject obj = new MyObject();
MyClass thread11 = new MyClass(obj,"1");
MyClass thread22 = new MyClass(obj,"2");
thread11.start();
thread22.start();
} }

package cc150.thread_lock;

class MyObject2{
public synchronized void foo(String name){ //加上synchronized块,给foo提供同步
synchronized(this){
try{
System.out.println("线程"+name+".foo()开始");
Thread.sleep(3000);
System.out.println("线程"+name+".foo()结束");
}catch(InterruptedException exc){
System.out.println("线程"+name+"中断");
}
}
} } public class MyClass2 extends Thread{ //不同的线程,来调用上面的foo private String name;
private MyObject2 myObj; public MyClass2(MyObject2 obj,String n){
name = n;
myObj = obj;
} public void run(){
myObj.foo(name);
} public static void main(String[] args) {
// TODO 自动生成的方法存根
// MyObject obj1 = new MyObject();
// MyObject obj2 = new MyObject();
// MyClass thread1 = new MyClass(obj1,"1");
// MyClass thread2 = new MyClass(obj2,"2");
// thread1.start();
// thread2.start(); //相同的obj引用,只能一个线程可以调用foo,另一个线程必须等待
MyObject2 obj = new MyObject2();
MyClass2 thread11 = new MyClass2(obj,"1");
MyClass2 thread22 = new MyClass2(obj,"2");
thread11.start();
thread22.start();
} }

package cc150.thread_lock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; class MyObj { private Lock lock;
private int balance = 100; //剩余 public MyObj(){ //构造函数
lock = new ReentrantLock(); //可重入锁
} public int withdraw(int value){ //取款
lock.lock();
int temp = balance;
try{
Thread.sleep(100);
temp = temp-value;
Thread.sleep(100);
balance = temp;
}catch(InterruptedException e){ }
lock.unlock();
return temp;
} public int deposit(int value){ //存款
lock.lock();
int temp = balance;
try{
Thread.sleep(100);
temp = temp+value;
Thread.sleep(100);
balance = temp;
}catch(InterruptedException e){ }
lock.unlock();
return temp;
}
} public class LockedATM extends Thread{ private int value;
private MyObj myObj;
private String str; public LockedATM(MyObj obj,String s,int v){
value = v;
myObj = obj;
str = s;
} public void run(){
if(str.equals("withdraw"))
System.out.println(myObj.withdraw(value));
else if(str.equals("deposit"))
System.out.println(myObj.deposit(value));
} public static void main(String[] args) {
// TODO 自动生成的方法存根
MyObj obj1 = new MyObj();
MyObj obj2 = new MyObj();
LockedATM thread1 = new LockedATM(obj1,"withdraw",50); //两个线程执行的顺序不一定
LockedATM thread2 = new LockedATM(obj2,"deposit",50); //可能先存款,也可能先取款
thread1.start();
thread2.start();
}
}

面试题目——《CC150》线程与锁的更多相关文章

  1. 最新天猫3轮面试题目:虚拟机+并发锁+Sql防注入+Zookeeper

    天猫一面 自我介绍.项目介绍 Spring拦截器.实现了哪些方法?底层原理 AOP如何配置,底层原理.2种动态代理,aop注解实现,xml定义切面 Bean的作用域,单例模式是否线程安全?恶汉模式是否 ...

  2. 字节跳动Java研发面试99题(含答案):JVM+Spring+MySQL+线程池+锁

    JVM的内存结构 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 1. Java虚拟机栈:线程私有:每个方法在执行的时候会创建一个栈帧,存储了局部变量表, ...

  3. 《Cracking the Coding Interview》——第16章:线程与锁——题目1

    2014-04-27 19:09 题目:线程和进程有什么区别? 解法:理论题,操作系统教材上应该有很详细的解释.我回忆了一下,写了如下几点. 代码: // 16.1 What is the diffe ...

  4. PHP面试题目搜集

    搜集这些题目是想在学习PHP方面知识有更感性的认识,单纯看书的话会很容易看后就忘记. 曾经看过数据结构.设计模式.HTTP等方面的书籍,但是基本看完后就是看完了,没有然后了,随着时间的推移,也就渐渐忘 ...

  5. (转)喜马拉雅2018 Java面试题目

    背景:将网上的题目整理下. java基础 1:hashTable hashMap ConcurrentHashMap 的区别.数据结构.线程安全 2:equals和==区别, 重写equals一定要重 ...

  6. C++程序员面试题目总结(涉及C++基础、多线程多进程、网络编程、数据结构与算法)

     说明:C++程序员面试题目总结(涉及C++基础知识.多线程多进程.TCP/IP网络编程.Linux操作.数据结构与算法) 内容来自作者看过的帖子或者看过的文章,个人整理自互联网,如有侵权,请联系作者 ...

  7. java常见面试题目(一)

    在大四实习阶段,秋招的时候,面试了很多家公司,总结常见的java面试题目:(答案可以自己百度) 1.你所用oracle的版本号是多少? 2.tomcat修改8080端口号的配置文件是哪个? 3.myb ...

  8. 全网最全C#实习面试题目

    整个内容是我在春招面试时候整理的一些题目,里面涵盖有网上搬运的(由于当时没有记录来源,如果有转载没标注来源,请与我联系),还有我面试到的.整个排版很乱,后期我会一步一步整理.整个内容大概快有两万字.整 ...

  9. 2020阿里Java面试题目大汇总,看看你离阿里还有多远,附答案!

    前言 首先说一下情况,我大概我是从去年12月份开始看书学习,到今年的6月份,一直学到看大家的面经基本上百分之90以上都会,我就在5月份开始投简历,边面试边补充基础知识等.也是有些辛苦.终于是在前不久拿 ...

  10. 33条C#、.Net经典面试题目及答案

    33条C#..Net经典面试题目及答案[zt] 本文集中了多条常见的C#..Net经典面试题目例如".NET中类和结构的区别"."ASP.NET页面之间传递值的几种方式? ...

随机推荐

  1. 一则因为numa引发的mysqldump hang住

    新买的dell r430服务器,双CPU,64G内存,单CPU32g,swap 3G 出现故障现像:mysqldump时会hang住,innodb_buffer_pool_size        = ...

  2. 设计模式C#实现(十五)——命令模式

    意图 0 适用性 1 结构 2 实现 3 效果 4 参考 5 意图 将请求封装成一个对象,客户接受请求参数:可以对请求排队或者记录请求日志,以及可以支持撤销操作 适用性 抽象出待执行的动作以参数化某对 ...

  3. LLVM 笔记(四)—— three-phase 设计的收益

    ilocker:关注 Android 安全(新手) QQ: 2597294287 采用 three-phase 的设计方式,便于编译器支持多种语言和多种目标平台. 如果在优化器阶段采用通用的 IR ( ...

  4. 使用开发者工具调试jsp页面中的脚本

    只举例火狐和谷歌.如果是火狐,一般是用firebug,首先确保开启脚本调试: 然后刷新一下要调试的页面,点击firebug中的行内,选择当前页面: js文件一般直接显示的是js文件的名字,而页面一般是 ...

  5. [mysql]三种方法为root账户指定密码

    前言:前段时间把mysql安装后一直没管它,当时就在奇怪为什么mysql登陆不要密码,原来一直用的超用户账户登陆的(简称超级用户) 其实只怪自己太无知,之前一直用的phpbydamin进行的数据库的可 ...

  6. 洛谷P1328 生活大爆炸版石头剪刀布——S.B.S.

    题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头剪刀布的升级版游戏. 升级版游戏在传统的 ...

  7. Vijos P1196吃糖果游戏[组合游戏]

    描述 Matrix67和Shadow正在做一个小游戏. 桌子上放着两堆糖果,Matrix67和Shadow轮流对这些糖果进行操作.在每一次操作中,操作者需要吃掉其中一堆糖果,并且把另一堆糖果分成两堆( ...

  8. POJ2406Power Strings[KMP 失配函数]

    Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 45005   Accepted: 18792 D ...

  9. POJ2001Shortest Prefixes[Trie]

    Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 17683   Accepted: 768 ...

  10. NYOJ 485

    A*B Problem 描述 设计一个程序求出A*B,然后将其结果每一位相加得到C,如果C的位数大于等于2,继续将C的各位数相加,直到结果是个一位数k. 例如: 6*8=48: 4+8=12: 1+2 ...