猿问

“Java 中的同步块在某个对象上同步”是什么意思..?

我知道为了实现线程安全和同步,我们使用同步块或方法。
但我无法理解语句-
“Java 中的同步块在某个对象上同步”

任何现实世界的例子都会有所帮助。


MMMHUHU
浏览 161回答 3
3回答

拉丁的传说

同步关键字的 3 种用法。明确:final Object object = new Object();synchronized(object) {}实例同步方法synchronized void foo() {}它将使用当前实例作为监视器锁,它等于:void foo() {    synchronized (this) {    }}所以当你调用foo不同的实例时,它们不会相互影响。类同步方法class Exmaple {    static synchronized void foo() {    }}它将使用当前类对象作为监视器锁,它等于:class Exmaple {    static void foo() {        synchronized (Exmaple.class) {        }    }   }

海绵宝宝撒

其效果synchronized是一次只有一个线程可以执行同步代码。但如果我们看细节,这并不是全部的真相。假设我们有两个 VectorsA并且B想要从不同的线程调用各种方法。Vector通过同步所有重要方法,该类是线程安全的。当线程 T1 执行时A.add(5,"abc"),为什么要阻止另一个线程执行B.get(5)?它们没有共同的数据元素,所以并行执行两个调用不会有什么坏处。这里出现了“在 A 上同步”的概念:Vector方法在Vector实例上同步,因此最多一个线程可以为任何给定的 Vector执行同步代码。所以向量 A 在 A 上同步,向量 B 在 B 上同步。 因此,没有两个线程可以并行操作向量 A,但一个线程可以在 A 上工作,另一个线程在 B 上独立工作。通过synchronized(object) { ... }构造,您可以决定要同步的对象。synchronized在实例方法上使用关键字,可以在当前 ( this) 对象上获得同步,因此每个实例都有自己的同步。synchronized在静态方法上使用关键字,您可以获得类的同步,因此您可以不受static synchronized此类的所有其他方法的影响,独立于任何实例。

心有法竹

同步在执行同步块之前对对象进行锁定(对象级锁定或类级锁定)。因此,Java 中的同步块在它获得锁的对象上是同步的。例如:synchronized (this)  // Lock on current objectsynchronized (lockObject) // Lock on an object lockObjectsynchronized(ClassA.class) // Lock on ClassA
随时随地看视频慕课网APP

相关分类

Java
我要回答