java - 抢占正在执行同步方法的线程

标签 java thread-safety

给出以下代码

    class Test{
       double x;
       public void synchronized a()
       { 
          x = 0;
          //do some more stuff
       }
       public void b() 
       { 
          x = -1; 
       } 
    }

a() 中的线程是否可以在修改 x 的过程中被调用同一对象上的 b() 的线程抢占?

同步方法不是像一个原子操作一样执行吗?

我相信另一种方法是可能的(b() 中的线程可以被在同一对象上调用 a() 的线程抢占,因为 b() 没有保护我的测试对象锁)。

有人可以阐明这一点吗?

最佳答案

synchronized 仅阻止其他线程获取同一监视器。它绝不会使操作成为原子操作。特别是:

  • 该方法的副作用可以被其他未尝试在同一监视器上同步的线程观察到
  • 如果发生异常,则不会回滚
  • 如果其他线程未在同一监视器上同步,则它们可以访问和修改同步方法使用的相同数据

b() 不是同步的,因此完全有可能一个线程正在执行 a() 而另一个正在执行 b() 同时。

关于java - 抢占正在执行同步方法的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6123580/

相关文章:

java - 抽象 Java 网格

java - LibGDX:在另一个线程中创建新的 scene2d 对象?

c# - 线程安全的 List<T> 属性

c# - ASP.NET 代码隐藏类中的静态方法是否是非线程安全的?

java - 在 println 中调用 println 方法

java - 引导日期选择器和 LocalDate 之间的一天转换

java - Spring 不使用带注解的构造函数(@JsonCreator)进行实例化

java - 根据 pom 中的 Activity 配置文件更改包装

java - 如何在操作时应用条件线程安全?

java - Netty - 在 channel 之间共享附件