黑马程序员技术交流社区
标题:
有关synchronized块的问题
[打印本页]
作者:
从前有个人
时间:
2013-11-8 15:58
标题:
有关synchronized块的问题
package multithread;
class Ticket {
public static void main(String[] args) {
// TODO 自动生成的方法存根
SaleTicket seller = new SaleTicket();
Thread thread1 = new Thread(seller);
Thread thread2 = new Thread(seller);
Thread thread3 = new Thread(seller);
thread1.start();
thread2.start();
thread3.start();
}
}
class SaleTicket implements Runnable{
private int x = 10;
Object obj = new Object();
public void run(){
while(true)
synchronized(new Object())
{ // 传入obj对象,程序执行正常。传入new Object(),synchronized块就会失效 WHY?
if(x>0){
try{Thread.sleep(10);} catch(Exception e){}
System.out.println(Thread.currentThread().getName()+" sell ticket"+x--);
}
}
}
}
问题如注释所述,为何传入 obj 和 传 new Object()会不同结果。
以下是传入 new Object()的执行结果
Thread-0 sell ticket10
Thread-1 sell ticket9
Thread-2 sell ticket8
Thread-0 sell ticket7
Thread-1 sell ticket6
Thread-2 sell ticket5
Thread-0 sell ticket4
Thread-1 sell ticket3
Thread-2 sell ticket2
Thread-0 sell ticket1
Thread-2 sell ticket0
Thread-1 sell ticket-1
作者:
唐宋元明清
时间:
2013-11-8 16:37
while(true){
synchronized(new Object()){ // 传入obj对象,程序执行正常。传入new Object(),synchronized块就会失效WHY?
if(x>0){
try{Thread.sleep(10);} catch(Exception e){}
System.out.println(Thread.currentThread().getName()+" sell ticket"+x--);
}
}
}
你每次进入循环相当于把前一个锁砸坏了扔了,用一把新锁锁住,然后强行进入房间。别人来了照样不会看你这把锁有没有用,而是直接砸坏扔了,这样你的锁的作用就完全失去了。
作者:
spiderman
时间:
2013-11-8 18:16
是这样的
继承了runnable接口以后,在各自的线程中都有一个run()方法,而run()方法以外的成员变量都是共享数据。
明白了这个以后,就是理解锁的概念了。
你应该知道,要想对一个代码块进行同步,需要用同一个锁吧?像你这样如果在run()里面直接new Object()
,那么这个锁就是一个线程所拥有,跟其他的线程没关系,当然就起不到同步的作用啦。而调用run()方法以外的obj就不同啦,因为这个锁是所有线程共有的,当然了起到同步的作用啦~~~
so easy,来了黑马论坛以后,妈妈再也不用担心我的学习了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2