黑马程序员技术交流社区

标题: 同步代码块的疑问? [打印本页]

作者: 李哲    时间: 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