黑马程序员技术交流社区
标题:
同步代码块的疑问?
[打印本页]
作者:
李哲
时间:
2012-3-28 21:12
标题:
同步代码块的疑问?
教程里面,刚开始介绍synchronized(){}时,是下面的例子
class Ticket implements Runnable
{
private int tick =1000;
Object obj=new Object();
public void run()
{
while(true)
{
synchronized (obj)
{
if(tick>0)
{
try{Thread.sleep(5);}
catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"---sale:"+tick--);
}
}
}
}
}
教程说,一旦有一个线程进入,其他线程根本就不能进入synchronized (obj)下面的语句。
可是后来的生产者消费者里面的同步函数,似乎就不太一样。如下
class Resource
{
private String name;
private int count=1;
private boolean flag=false;
public synchronized void set(String name)
{
while(flag)
try{this.wait();}catch(Exception e){}//t1,t2都会等待在这个地方?怎么会有两个线程进来?这个函数不是已经被同步了吗?
this.name=name+"--"+count++;
System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name);
flag=true;
this.notifyAll();
}
public synchronized void out()
{
while(!flag)
try{this.wait();}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"...消费者............"+this.name);
flag=false;
this.notifyAll();
}
}
public synchronized void set(String name){}为什么会有两个线程都进去呢?判断while(flag)后,都等在那?
作者:
刘基军
时间:
2012-3-28 21:32
this.wait();会将当前线程等待,该线程就会释放锁,其他线程就可以开始执行了,
作者:
马云
时间:
2012-3-28 21:32
不会进去吧,你运行试下,
可能是老师讲的时候打比方了吧。
作者:
李哲
时间:
2012-3-28 21:43
刘基军 发表于 2012-3-28 21:32
this.wait();会将当前线程等待,该线程就会释放锁,其他线程就可以开始执行了,
等待就会释放锁啊?我还以为只有线程出了同步代码块区域,才会释放呢。
作者:
贠(yun)靖
时间:
2012-3-29 00:59
synchronized 放在方法上 默认的锁是this 所以两个方法同步 在写入语句中wait线程后 锁就开启状态 其他线程就可以进入同步代码中执行相应的程序了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2