A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李哲 中级黑马   /  2012-3-28 21:12  /  1692 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

教程里面,刚开始介绍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)后,都等在那?

4 个回复

倒序浏览
this.wait();会将当前线程等待,该线程就会释放锁,其他线程就可以开始执行了,
回复 使用道具 举报
不会进去吧,你运行试下,
可能是老师讲的时候打比方了吧。
回复 使用道具 举报
刘基军 发表于 2012-3-28 21:32
this.wait();会将当前线程等待,该线程就会释放锁,其他线程就可以开始执行了,

等待就会释放锁啊?我还以为只有线程出了同步代码块区域,才会释放呢。
回复 使用道具 举报
synchronized  放在方法上 默认的锁是this  所以两个方法同步  在写入语句中wait线程后  锁就开启状态  其他线程就可以进入同步代码中执行相应的程序了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马