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.
不,事实并非如此。如果每个方法调用都必须查看其方法被调用的对象上是否有锁,将会对性能造成很大影响。
我有一个具有某种状态的 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.
不,事实并非如此。如果每个方法调用都必须查看其方法被调用的对象上是否有锁,将会对性能造成很大影响。