java中同步块的部分执行

Sub*_*dar 2 java multithreading synchronization thread-synchronization

我只是好奇线程 T1 是否有可能部分执行同步块,然后释放对象上的锁,而另一个线程 T2 执行同一块?像这样的东西:

line1: synchronized(this){
line2:  if(INSTANCE == null)
line3:   INSTANCE = new Object(); //say a variable is initialized
line4:  return INSTANCE;
line5: }
Run Code Online (Sandbox Code Playgroud)

线程 T1 是否有可能获取当前对象 ( this) 的锁并执行 line1 和 line2。然后线程 T1 被线程 T2 抢占,T1 释放锁,T2 获取锁this并执行同一块(所有行 1 到 5)。然后线程T1再次获得锁并继续从第3行开始执行?

基本上,T1 将被视为INSTANCEnull,T2 也将被视为 null,并且每个对象都会创建一个新对象。

如果这是不可能的,有人可以解释为什么不可以吗?

附录:

谢谢大家的回答。我的问题有点误导。我到底想问的是,一旦一个线程执行同步块,它是否可以在整个块执行之前释放锁(不是通过显式调用,wait()而是依赖于进程、CPU)?JLS 或 JVM 中是否有约定保证一旦线程开始执行同步块,对象上的锁直到块结束才被释放?我的理解是同步保证没有2个线程可以同时执行该块(或其他同步方法/块),但锁会一直保持到到达块末尾?这很明显,但是 JLS 中有指定吗?

Sne*_*tel 5

线程抢占不会导致被抢占的线程释放其锁。如果是这样,锁就毫无价值了。块的全部意义synchronized在于,它将禁止其他线程在同一对象上同步,直到该线程释放锁(通过离开块synchronized)。