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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 焦健 高级黑马   /  2013-1-21 14:59  /  2457 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-1-22 12:46 编辑

我们都知道同步代码块和同步函数的作用是对要执行的语句加锁,以实现同步,那么同步代码块或者同步函数里面有没有可能出现1条以上的线程情况,请大家分析。。。

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

9 个回复

倒序浏览
取决于个人需要吧。
你想让它有几条线程都行,只要不用同一对象锁。。。
没啥意义了。
不控制它,就彻底乱了。
回复 使用道具 举报
王少雷 发表于 2013-1-21 15:06
取决于个人需要吧。
你想让它有几条线程都行,只要不用同一对象锁。。。
没啥意义了。

是用的同一个锁。。
回复 使用道具 举报
在一个类中只有一个需要同步的,建议使用同步函数;如果有多同步,必须使用同步代码块,来确定不同的锁。所以同步代码块相对灵活一些。
   同步代码块使用的锁可以是任意对象。
同步函数使用的锁是this,静态同步函数的锁是该类的字节码文件对象。
回复 使用道具 举报
焦健 发表于 2013-1-21 15:10
是用的同一个锁。。

纳尼?是不是啊。。。求代码。
回复 使用道具 举报
王少雷 发表于 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;

        }
}
回复 使用道具 举报
同步代码块的意义是上锁,  上锁呢?  是为了只要将操作共享数据的语句在某一时段让一个线程执行完,在执行过程中,其他线程不能进来执行就可以解决这 个问题。  
    所以同步代码块里面是可以有多条线程的。只不过是需要一条执行完 才能进入下一条执行。
    这就是为了防止其他线程抢夺执行而上锁的意义。

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
wait后应该是其对应的线程释放了锁了,所以实质上还是一个线程在同步内执行。  
回复 使用道具 举报
胥文 中级黑马 2013-1-21 16:56:11
9#
个人觉得此代码还有安全问题,不知道理解的对不对,原因如下:
线程1拿到set()的锁之后进去了,然后在执行name的时候挂在哪里了,这时候线程2获得out()的锁但是没有进去而是挂在那里了,如果这时候线程2拿着out()的锁(因为他们的锁都是this)去执行set(),就可能造成安全问题。
回复 使用道具 举报
同步函数或同步代码块,他们是用来解决多线程安全问题的,所谓锁,就是只让一个线程进入,执行完在进来另一个线程,如果是单线程还定义同步函数或同步代码块,那样是没有意义的。因为根本就不会涉及多线程安全问题
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马