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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王怡然 黑马帝   /  2012-5-7 12:42  /  1936 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

评分

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

查看全部评分

4 个回复

倒序浏览
想要程序同步的前提必须用同一把锁,因为静态中没有this,所以静态的方法用的锁是,类名.class的字节码文件,而普通方法默认的是this
synchronized(类名.class)

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1

查看全部评分

回复 使用道具 举报
同步的前提:
1,必须要有两个或者两个以上的线程
2,必须是多个线程使用同一个锁
3,必须保证同步中只能有一个线程在运行
好处:解决了多线程的安全问题
弊端:多个线程需要判断锁,消耗资源
静态进内存时在内存中没有本类对象,所以不可以定义this,但是一定有应类应对的
字节码文件即:类名。calss
回复 使用道具 举报
要想同步的前提是,必须有两个或两个以上的线程,使用的锁必须是同一个。
A方法是静态的使用的 类名.class ,如果要想线程同步B方法不能用同步函数,因为他表示的是当前对象。B方法只能用同步代码块,并且是类名.class.
回复 使用道具 举报
本帖最后由 隋营营 于 2012-5-7 13:08 编辑

A与B不会同时被锁住!
静态的 A 被您写的那个类锁住,而B被 this 锁住,相当于下面的代码:
public class Test {
   
public static void A() {
        
synchronized(Test.class) {
            
...
        
}
   
}

   
public void B() {
        
synchronized(this) {
            
...
        
}
   
}
}锁住A时B依然会被调用!

但是如果你在A()方法中调用了B()方法,当有线程访问A()时,这个线程同时有A和B的监视器,
这时你要小心了:如果去掉锁时先去除B的锁再去除A的锁,就会引起deadlock。

个人建议,最好不要锁住整个方法,而是尽量锁住private、final类型的属性或者代码块!

评分

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

查看全部评分

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