我知道为了实现线程安全和同步,我们使用同步块(synchronized block)或方法。
但我无法理解这个说法-
“Java 中的同步块(synchronized block)在某个对象上同步”
任何现实世界的例子都会有帮助。
最佳答案
synchronized
的作用是一次只有一个线程可以执行同步代码。但如果我们看看细节,就会发现事实并非如此。
假设我们有两个 vector A
和B
并且想要从不同的线程调用各种方法。 Vector
类通过同步所有重要方法来实现线程安全。当线程 T1 执行 A.add(5,"abc")
时,为什么会阻止另一个线程执行 B.get(5)
?它们没有共同的数据元素,因此并行执行两个调用不会有什么坏处。
这里出现了“在 A 上同步”的概念:Vector
方法在 Vector
实例上同步,因此最多有一个线程可以执行同步代码对于任何给定的 vector 。
因此, vector A 在 A 上同步, vector B 在 B 上同步。因此,没有两个线程可以并行操作 vector A,但一个线程可以在 A 上工作,而另一个线程可以独立地在 B 上工作。
- 使用
synchronized(object) { ... }
构造,您可以决定要同步的对象。 - 在实例方法上使用
synchronized
关键字,您可以在当前 (this
) 对象上获得同步,因此每个实例都会获得自己的同步。 - 在静态方法上使用
synchronized
关键字,您可以在类上获得同步,这样您就可以获得针对此类的所有其他static Synchronized
方法的保护,而与任何其他方法无关。实例。
关于java - "A synchronized block in Java is synchronized on some object"是什么意思..?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52678805/