java - 关于java同步的理解和困惑

标签 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()。

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

同步块(synchronized block)和同步方法之间有什么区别?区别只是 block 的同步范围较小,因此效率较高吗?

我读到一篇文章,指出“如果作为参数提供给 block 的表达式计算结果为 null,则同步块(synchronized block)可能会抛出 java.lang.NullPointerException”。

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

我哪里理解错了?

最佳答案

Now if thread t1 with instance a1 call the method m1,there is only restriction that thread t2 with instance a1 can't execute method m1 untill t1 finishes the execution of m1. And t2 with instance a2 can execute m1().

这是正确的。由于两个线程在同一实例上同步,因此第一个Thread 开始执行,第二个Thread 开始等待。

Now my doubt is Can thread t1 with a1 can execute other method's(except m1) parallaly while executing m1?

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

what's difference b/w synchronized block and synchronized method? Is the difference only that the block have lesser scope for synchronization so it is efficient?

同步 block 可以在任何实例上使用。 synchronized 方法隐式同步 this。尝试仅在实际关键部分周围尽可能频繁地使用同步 block 。

I raed a article stating "Synchronized block can throw java.lang.NullPointerException if expression provided to block as parameter evaluates to null".

以下内容

synchronized(null) {...}

会抛出NullPointerException

关于java - 关于java同步的理解和困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19229084/

相关文章:

java - 正则表达式匹配行尾两次

java - 执行 PHPUnit_Selenium

multithreading - Puma 中的 Workers 和 Threads 有什么区别

java - Java中断线程的更好方法

javascript - 通过 Websocket 同步任意两个 Javascript 对象

c# - 为什么锁确保底层监视器被释放而直接使用监视器却没有?

java - 使用 Spring ACL 3 保护域对象

java - Java多线程程序中生产者消费者线程的互换角色

java - 不同的线程有不同的栈

java - 在这种情况下,线程如何同时获取两个对象的锁?