我只是好奇线程 T1 是否可能说部分执行同步块(synchronized block)然后释放对象上的锁,而另一个线程 T2 执行同一个 block ?像这样:
line1: synchronized(this){
line2: if(INSTANCE == null)
line3: INSTANCE = new Object(); //say a variable is initialized
line4: return INSTANCE;
line5: }
线程 T1 是否有可能获取当前对象 (this
) 的锁并执行 line1 和 line2。然后线程 T1 被线程 T2 抢占,T1 释放锁,T2 获取 this
上的锁并执行同一个 block (所有 1 到 5 行)。然后线程 T1 再次获取锁并从第 3 行继续执行?
基本上,T1 会将 INSTANCE
视为 null,T2 也是如此,并且每个人都会创建一个新对象。
如果这不可能,有人可以解释为什么不吗?
附录:
谢谢大家的回答。我的问题有点误导。我要问的是,一旦一个线程正在执行一个同步块(synchronized block),它是否可以在执行整个 block 之前释放锁(不是通过显式调用 wait()
而是一些过程, CPU 依赖)? JLS 或 JVM 中是否有契约(Contract)保证一旦线程开始执行同步块(synchronized block),直到 block 结束时才会释放对象上的锁?我的理解是同步保证没有 2 个线程可以同时执行 block (或其他同步方法/ block ),但是锁一直保持到 block 结束为止?这有点明显,但它在 JLS 中指定了吗?
最佳答案
线程抢占不会导致被抢占的线程释放它的锁。如果是这样,锁将毫无值(value)。 synchronized
block 的全部要点是它将禁止其他线程在同一对象上同步,直到线程释放锁(通过离开 synchronized
block )。
关于java - java中同步块(synchronized block)的部分执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27555325/