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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李方哲 黑马帝   /  2011-9-28 14:53  /  1956 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

假设我现在写了一个类,里面有两个方法,我要调用几个线程来执行它,
但是我需要加一个同步锁,如果方法A是静态方法,B是普通方法,
synchronized锁住这两个线程,是不是锁住A的时候B依然会被调用,这样是不是还是不安全。

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2

查看全部评分

3 个回复

倒序浏览
黑马网友  发表于 2011-9-28 15:20:50
沙发
锁都有具体的对象,一个锁只能对应一个对象,如果两个所使用的不是同一个对象的话那么这个两个锁甲不是同一个锁。
回复 使用道具 举报
黑马网友  发表于 2011-9-28 15:34:45
藤椅
如果是直接在A和B方法中加synchronized,A和B使用的线程监视器对象(可以说是锁吧!)是不同的,线程执行时仍然是不安全的,静态方法使用的监视器对象是类的字节码,而普通方法使用的是this对象,它们使用的是不同的锁,当然不能实现同步了。

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-28 22:49:42
板凳
两个方法只有使用的锁是同一个对象才能达到同步效果。
静态的同步方法,使用的锁是该方法所在类的字节码文件对象 类名.class
普通的同步方法,使用的锁是该类的实例对象this,
所以静态的同步方法和普通的同步方法使用的锁不是同一个对象,不能达到同步效果。

解决办法:
   要想让两个方法同步,那么两个对象使用的锁就必须是同一个对象,让普通方法也使用 本类的字节码对象 类名.class  就可以达到同步效果了。
   把普通方法改成
   synchronized(本类名.class){
                       调用普通方法;
                    }
      就解决问题了

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马