java - java中同步块(synchronized block)的部分执行

标签 java multithreading synchronization thread-synchronization

我只是好奇线程 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/

相关文章:

Java Lambda 流到不同的集合中

java - 当节点包含值时使用 JAXB 将 XML 转换为对象

java - 使用 jdbc 将查询插入数据库时​​出错

linux - Linux系统不忙时如何调度任务

java - 同步的java线程错误的输出顺序

java - 在可重入锁中等待条件

java - 处理不同语言的月份名称

python - 使用 Matplotlib、PyQt 和 Threading 进行实时绘图以 python 崩溃结束

java - 两个线程引用了非同步类的非共享实例。线程问题?

c# - 为套接字/网络连接同步对象-最佳实践不使用WCF?