为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

MMMHUHU 2021-10-28 17:30:32
我知道为了实现线程安全和同步,我们使用同步块或方法。但我无法理解语句-“Java 中的同步块在某个对象上同步”任何现实世界的例子都会有所帮助。
查看完整描述

3 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

同步关键字的 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) {


        }

    }   

}


查看完整回答
反对 回复 2021-10-28
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

其效果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此类的所有其他方法的影响,独立于任何实例。


查看完整回答
反对 回复 2021-10-28
?
心有法竹

TA贡献1866条经验 获得超5个赞

同步在执行同步块之前对对象进行锁定(对象级锁定或类级锁定)。


因此,Java 中的同步块在它获得锁的对象上是同步的。


例如:


synchronized (this)  // Lock on current object

synchronized (lockObject) // Lock on an object lockObject

synchronized(ClassA.class) // Lock on ClassA


查看完整回答
反对 回复 2021-10-28
  • 3 回答
  • 0 关注
  • 152 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信