Class 级同步如何在 Java 中实现?

How Class level Synchronization implement in Java?

我有一个具有某种状态的 class 对象。 这个对象有两个方法(method1()method2()),都在改变obj的状态。 method1() 已同步,但 method2() 未同步。

现在有两个线程,thread1 和 threads2 接近对象 ->threads1 调用同步的 method1() -> 线程 2 调用未同步的 method2()

我在测试结果中发现 method2() 即使 method1() 持有锁也能正确执行。但是我想如果把synchronized关键字放在方法上,给整个对象加了锁,还有多少方法可以执行。它应该等待。

非常感谢您的意见。

But I thought that if a lock is acquired on the entire object by putting sync on method than how any other method can be executed. It should wait.

一把锁不知道它锁的是什么。它只是防止其他线程获取同一个锁。

当我们说调用synchronized方法或块导致锁定时,这意味着线程独占地获取了锁。这并不意味着线程获得其锁的对象的状态受到任何其他保护。

(内在锁附加到对象,包括 class 对象,作为语言设计者的便利。这个决定可能不是最好的决定。使用专用对象锁定通常更好想法。)

您的非同步调用可能会破坏共享状态。除此之外,没有设置内存屏障,并且调用非同步方法的线程所做的更改可能不会被其他线程看到。在进行重新排序代码等优化时,JIT 不会考虑 cross-thread 可见性问题。

很难预测未充分同步的代码中会发生什么。

这里有一些很好的答案,但我认为需要更详细一些。

What is found with my test results that the method2() was executing happily even though method1() had a lock.

当线程进入 synchronized 方法时,它会锁定与对象实例关联的监视器。其他线程可以根据需要在同一个对象实例上调用其他 non-synchronized 方法。 thread1 持有的锁不会以任何方式更改 obj。只有 thread2 also 去锁定 same 对象实例才会被阻塞。

But I thought that if a lock is acquired on the entire object by putting sync on method than how any other method can be executed. It should wait.

不,事实并非如此。如果每个方法调用都必须查看其方法被调用的对象上是否有锁,将会对性能造成很大影响。