只是想确定我理解锁定
public class MySync {
public static synchronized byte[] getRes(String str1, String str2) throws Exception {
...
return new byte[myLen];
}
//no other methods
}
public class MyClass extends MyClass2 {
public MyStuff getStuff (SomeObj obj) {
byte[] res = MySync.getRes(s1,s2);
...
}
...
}
线程1调用MyClass
线程2调用MyClass
线程3调用MyClass
T1调用getres。
T2等待T1完成锁定在MySync类上
T3等待T1完成对MySync类的锁定
T1完成
T3调用getres(即命令是/不被保留?)
T2等待T3完成
T3完成了
T2调用getres
是?
getRes现在是“瓶颈”;线程需要在“队列”中等待?
注意,我确实想要这个用于我的应用程序。每次操作只允许一个线程。
除了锁在myLock类上之外,下面的内容与上面相同吗?
这是优选的,为什么?
public class MySync {
private static final Object myLock = new Object();
public byte[] getRes(String str1, String str2) throws Exception {
synchronized (myLock) {
...
return new byte[myLen];
}
public class MyClass extends MyClass2 {
public MyStuff getStuff (SomeObj obj) {
byte[] res = new MySync().getRes(s1,s2);
...
}
答案 0 :(得分:3)
如果是
public static synchronized byte[] getRes(String str1, String str2)
隐式锁定将是class
实例,它是MySync.class
(因为它是一个静态同步方法)。所以是的,你是对的,它的互相排斥。
如果是
public class MySync {
private static final Object myLock = new Object();
public byte[] getRes(String str1, String str2) throws Exception {
synchronized (myLock) {
结果相同,因为您myLock
类的多个实例中的锁static
为MySync
且共享
首选方法是首选,因为MySync.class
对象不会有线程锁定/解锁的开销,而是有一个专用的myLock
对象
正如@BoristheSpider的评论中提到的,Java5引入的Lock objects为程序员提供了更大的灵活性来管理方法/块上的锁,并且它更具可读性。
答案 1 :(得分:0)