黑马程序员技术交流社区

标题: 同步锁得问题. [打印本页]

作者: 王怡然    时间: 2012-5-7 12:42
标题: 同步锁得问题.
假设我现在写了一个类,里面有两个方法,我要调用几个线程来执行它,
但是我需要加一个同步锁,如果方法A是静态方法,B是普通方法,
synchronized锁住这两个线程,是不是锁住A的时候B依然会被调用,这样是否还是不安全。
作者: 黄或俊    时间: 2012-5-7 12:44
想要程序同步的前提必须用同一把锁,因为静态中没有this,所以静态的方法用的锁是,类名.class的字节码文件,而普通方法默认的是this
synchronized(类名.class)
作者: 周素强    时间: 2012-5-7 12:54
同步的前提:
1,必须要有两个或者两个以上的线程
2,必须是多个线程使用同一个锁
3,必须保证同步中只能有一个线程在运行
好处:解决了多线程的安全问题
弊端:多个线程需要判断锁,消耗资源
静态进内存时在内存中没有本类对象,所以不可以定义this,但是一定有应类应对的
字节码文件即:类名。calss
作者: 郭振    时间: 2012-5-7 12:57
要想同步的前提是,必须有两个或两个以上的线程,使用的锁必须是同一个。
A方法是静态的使用的 类名.class ,如果要想线程同步B方法不能用同步函数,因为他表示的是当前对象。B方法只能用同步代码块,并且是类名.class.
作者: 隋营营    时间: 2012-5-7 13:06
本帖最后由 隋营营 于 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类型的属性或者代码块!





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