0

假设我们有

class A {
    synchronized void m1() {
    }
    synchronized void m2() {
    }
    void m3() {
    }
    static void m6() {
        synchronized(this){
        }
    }
}

和 A 类 a1&a2 的两个实例。

现在如果线程 t1 和实例 a1 调用方法 m1,那么只有实例 a1 的线程 t2 不能执行方法 m1,直到 t1 完成 m1 的执行。具有实例 a2 的 t2 可以执行 m1()。

现在我的疑问是线程 t1 与 a1 可以在执行 m1 时并行执行其他方法(m1 除外)吗?

黑白同步块和同步方法有什么区别?只是块的同步范围较小,所以它是有效的吗?

我读了一篇文章,说明“如果作为参数提供给块的表达式计算为 null,则同步块可以抛出 java.lang.NullPointerException”。

我们总是使用“this”作为同步块的参数,所以只有并且总是在静态方法中使用同步块。因为我们不需要对象实例来执行静态方法。

我在哪里误解了它?

4

3 回答 3

4

现在如果线程 t1 和实例 a1 调用方法 m1,那么只有实例 a1 的线程 t2 不能执行方法 m1,直到 t1 完成 m1 的执行。具有实例 a2 的 t2 可以执行 m1()。

这是对的。由于两个线程都synchronized在同一个实例上,所以第一个线程Thread开始执行,第二个线程Thread等待。

现在我的疑问是线程 t1 与 a1 可以在执行 m1 时并行执行其他方法(m1 除外)吗?

是的,这称为可重入同步。看看本教程的结尾。

黑白同步块和同步方法有什么区别?只是块的同步范围较小,所以它是有效的吗?

synchronized块可以在任何实例上使用。方法隐式synchronized同步。尽量只在实际临界区this周围使用synchronized块。

我阅读了一篇文章,指出“如果作为参数提供给块的表达式计算为 null,则同步块可以抛出 java.lang.NullPointerException”。

以下

synchronized(null) {...}

会抛出NullPointerException.

于 2013-10-07T15:51:12.790 回答
0

例如, synchronized(this){...} 将仅在实际临界区周围运行,并且仅在当前实例上运行,但 synchronized(otherInstance){...} 将与其他实例一起工作,而与当前实例无关

于 2013-10-07T16:12:50.890 回答
0

我想是的。

关于在 this 上同步,如果您在 'this' 或任何公开可见的对象上同步特定类的内部(甚至外部)逻辑,则您冒着类外的某些东西可能通过持有来“干扰”事物的风险上锁。所以......每当您决定针对特定情况的锁定机制时,您需要权衡并在您的 API 中明确该对象的锁定策略是什么。

于 2013-10-07T16:42:12.847 回答