0

只是想确定我理解锁定

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

2 回答 2

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) {

结果是相同的,因为您的锁myLockstatic并且它在您的类的多个实例之间共享MySync

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

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

于 2013-08-02T14:17:56.907 回答
0

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

不过,您可以使用来指示顺序。

此外,在情况 1 中,锁在整个Class object上,在后一种情况下,它就在lock.

于 2013-08-02T14:31:48.390 回答