0

我刚刚开始使用 Java 同步,我有一个小问题。

这个方法是:

public synchronized void method() {
    // ... do staff ...
}

等于:

public void method() {
    synchronize(this) {
        // ... do staff ...
    }
}

附言

最近我看了 2 篇关于 Java 的好 confs(我的问题由此而来)视频 1视频 2。你有一些相关的视频吗(我对 Java 和 Android 编程很感兴趣)。

4

5 回答 5

0

是的。还有这个:

public static synchronized void method() {
}

相当于:

public static void method() {
    synchronized (EnclosingClass.class) {
    }
}

关于视频,只需在 youtube 上搜索“java 同步”即可。

于 2013-07-27T10:08:11.603 回答
0
public void method() {
    synchronize(this) {
        // ... do staff ...
    }
}

在语义上等价于

public synchronized void method() {
    // ... do staff ...
}
于 2013-07-27T10:08:15.053 回答
0

是的。同步方法在该方法所属的实例上隐式同步。

于 2013-07-27T10:09:15.943 回答
0

方法

public synchronized void method() { // blocks "this" from here.... 
    ...
    ...
    ...
} // to here

public void method() { 
    synchronized( this ) { // blocks "this" from here .... 
        ....
        ....
        ....
    }  /// to here...
}

块确实比方法有优势,最重要的是灵活性。唯一真正的区别是同步块可以选择在哪个对象上同步。同步方法只能使用“this”(或同步类方法的相应类实例)。

同步块更灵活,因为它可以竞争任何对象的关联锁,通常是成员变量。它也更细化,因为您可以在块之前和之后执行并发代码,但仍在方法内。当然,您可以通过将并发代码重构为单独的非同步方法来轻松使用同步方法。使用使代码更易于理解的那个。

使用同步方法而不是同步块有优势吗?

于 2013-07-27T10:10:01.447 回答
0

代码outside synchronized block可以同时访问multiple threds

public void method(int b) {
    a = b // not synchronized stuff
    synchronize(this) {
        // synchronized stuff
    }
}

这将始终同步:

public synchronized void method() {
    // synchronized stuff
}
于 2013-07-27T10:11:11.097 回答