黑马程序员技术交流社区

标题: 同步代码块和同步函数问题 [打印本页]

作者: 焦健    时间: 2013-1-21 14:59
标题: 同步代码块和同步函数问题
本帖最后由 张向辉 于 2013-1-22 12:46 编辑

我们都知道同步代码块和同步函数的作用是对要执行的语句加锁,以实现同步,那么同步代码块或者同步函数里面有没有可能出现1条以上的线程情况,请大家分析。。。
作者: 王少雷    时间: 2013-1-21 15:06
取决于个人需要吧。
你想让它有几条线程都行,只要不用同一对象锁。。。
没啥意义了。
不控制它,就彻底乱了。
作者: 焦健    时间: 2013-1-21 15:10
王少雷 发表于 2013-1-21 15:06
取决于个人需要吧。
你想让它有几条线程都行,只要不用同一对象锁。。。
没啥意义了。

是用的同一个锁。。
作者: 王勇文    时间: 2013-1-21 15:12
在一个类中只有一个需要同步的,建议使用同步函数;如果有多同步,必须使用同步代码块,来确定不同的锁。所以同步代码块相对灵活一些。
   同步代码块使用的锁可以是任意对象。
同步函数使用的锁是this,静态同步函数的锁是该类的字节码文件对象。

作者: 王少雷    时间: 2013-1-21 15:13
焦健 发表于 2013-1-21 15:10
是用的同一个锁。。

纳尼?是不是啊。。。求代码。
作者: 焦健    时间: 2013-1-21 15:17
王少雷 发表于 2013-1-21 15:13
纳尼?是不是啊。。。求代码。

class Res3{
        public String name;
        int count=1;
        boolean flag=false;
        public synchronized void set(){
                while(flag){
                        try {wait();} catch (InterruptedException e){}
                }
                name="+烤鸭+-----"+count++;
                System.out.println(Thread.currentThread().getName()+"生产--"+name);
                notifyAll();
                flag=true;

        }
        public synchronized void out(){
                while(!flag){
                        try {wait();} catch (InterruptedException e){}
                }
                System.out.println(Thread.currentThread().getName()+"消费-----"+name);
                notifyAll();
                flag=false;

        }
}

作者: 王勇文    时间: 2013-1-21 15:41
同步代码块的意义是上锁,  上锁呢?  是为了只要将操作共享数据的语句在某一时段让一个线程执行完,在执行过程中,其他线程不能进来执行就可以解决这 个问题。  
    所以同步代码块里面是可以有多条线程的。只不过是需要一条执行完 才能进入下一条执行。
    这就是为了防止其他线程抢夺执行而上锁的意义。
作者: Rancho_Gump    时间: 2013-1-21 16:15
wait后应该是其对应的线程释放了锁了,所以实质上还是一个线程在同步内执行。  
作者: 胥文    时间: 2013-1-21 16:56
个人觉得此代码还有安全问题,不知道理解的对不对,原因如下:
线程1拿到set()的锁之后进去了,然后在执行name的时候挂在哪里了,这时候线程2获得out()的锁但是没有进去而是挂在那里了,如果这时候线程2拿着out()的锁(因为他们的锁都是this)去执行set(),就可能造成安全问题。

作者: 高浩    时间: 2013-1-21 22:28
同步函数或同步代码块,他们是用来解决多线程安全问题的,所谓锁,就是只让一个线程进入,执行完在进来另一个线程,如果是单线程还定义同步函数或同步代码块,那样是没有意义的。因为根本就不会涉及多线程安全问题




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2