线程同步澄清

时间:2013-08-02 14:12:07

标签: java multithreading locking sync

只是想确定我理解锁定

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);
    ...
}

2 个答案:

答案 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类的多个实例中的锁staticMySync共享

首选方法是首选,因为MySync.class对象不会有线程锁定/解锁的开销,而是有一个专用的myLock对象

正如@BoristheSpider的评论中提到的,Java5引入的Lock objects为程序员提供了更大的灵活性来管理方法/块上的锁,并且它更具可读性。

答案 1 :(得分:0)

synchronize的情况下,获取锁的线程的顺序是随机的。

您可以使用lock来指定订单。

此外,在案例1中,锁定在整个Class object上,在后一种情况下,它刚好超过lock