理解和混淆java中的同步

时间:2013-10-07 15:47:05

标签: java multithreading synchronization

假设我们有

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

和A a1& a2。

类的两个实例

现在,如果带有实例a1的线程t1调用方法m1,则仅限制具有实例a1的线程t2不能执行方法m1,直到t1完成m1的执行。并且实例a2的t2可以执行m1()。

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

b / w同步块和同步方法有什么区别?区别仅在于块具有较小的同步范围,因此效率很高吗?

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

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

我在哪里误解了它?

3 个答案:

答案 0 :(得分:4)

  

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

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

  

现在我的疑问是,带有a1的线程t1可以执行其他操作   在执行m1时,方法(m1除外)是否平行?

是的,这称为可重入同步。看看end of this tutorial.

  

b / w同步块和同步方法有什么区别?是   区别仅在于块的范围较小   同步所以效率很高?

synchronized块可用于任何实例。 synchronized方法隐式地在this上同步。尽可能经常在实际的关键部分周围使用synchronized块。

  

我搜索了一篇文章,声称“同步块可以抛出   java.lang.NullPointerException如果将表达式提供给块为   参数计算为null“。

以下

synchronized(null) {...}

会抛出NullPointerException

答案 1 :(得分:0)

例如,synchronized(this){...}将仅在实际临界区周围运行,并且仅在当前实例上运行但是synchronized(otherInstance){...}将与其他实例一起独立于当前实例

答案 2 :(得分:0)

我想是的。

关于对此进行同步,如果您对“this”或某个特定类的内部(甚至外部)逻辑的任何公开可见对象进行同步,您将面临类外的某些内容可能“干扰”的风险坚持锁定的东西。因此......无论何时决定特定案例的锁定机制,您都需要权衡一下并在API中明确该对象的锁定策略是什么。