黑马程序员技术交流社区
标题:
同步锁得问题.
[打印本页]
作者:
王怡然
时间:
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