java - 进入同步块(synchronized block)是原子的吗?

标签 java multithreading synchronization synchronized

你知道java中的synchronized block 是否保证是原子的吗?

想象一下下面的情况

线程_1,2:

synchronized(object){object.modify();}

(对象是共享变量。)

假设 thread_M 会改变对对象的引用

synchronized(object){object = new Object()}

现在假设线程 1 和 2 正在竞争获取对象的锁

是否有可能发生以下情况:
1. Thread1: 读取旧对象
2. ThreadM: 修改对象引用并释放旧对象锁
3.线程2:读取新对象;检查锁;锁定它
4. Thread1:检查锁(ok cos old object was read);锁定它
现在两个线程都有锁并修改相同的(新)对象

因此,具体说明我的问题 - 是否可以在某处保证同步(对象)步骤(1 和 4)是原子的(如步骤 3 中所述)?

最佳答案

假设你有一些变量,foo:

Foo foo;

假设它持有一个对象的引用:

foo = new Foo(...);

假设我们有一个synchronized block :

synchronized(foo) {
    ...
}

synchronized 关键字对变量foo 进行操作,并且对同步块(synchronized block)中的语句。

synchronized 关键字在这里做的唯一一件事是防止其他线程同时在同一实例 上进行同步。

如果在线程 A 位于 block 内时重新分配变量 foo 以引用某个不同的实例,那么其他线程 B 将能够同时进入同一 block ,因为每个两个线程中的一个将在不同的实例上同步。

关于java - 进入同步块(synchronized block)是原子的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29217266/

相关文章:

java - 使用 NetBeans 查找并替换整个项目中的代码块

java - 在子类中抛出错误、异常和运行时异常

ios - 使用 NSRecursiveLock 从方法返回值

java - Java 中 'this' 可以通过哪些方式转义?

tfs - 有没有办法在 2 个 TFS 2012 服务器之间同步任务和源代码数据?

java - 带 GAE 的 Ninja 框架 : accessing the google app engine development console

java - 使用 FTPClient 检查目录是否存在

c++ - 如果没有加入则中断线程

vb.net - VB窗体跨线程方法调用带参数

java - 当多个 JVM 访问同一个数据库时,如何在 Java 中获取行级锁?