其效果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