当前位置: 首页 > 知识库问答 >
问题:

同步块中的静态与非静态锁定对象

农建弼
2023-03-14

尝试可视化和理解同步。

  1. 对同步块使用静态锁定对象(代码a)和非静态锁定对象(代码B)之间有什么区别
  2. 它在实际应用中有什么不同
  3. 一方会有哪些陷阱而另一方不会
  4. 确定使用哪一个的标准是什么

代码A

public class MyClass1 {
  private static final Object lock = new Object();
  public MyClass1() {
    //unsync
    synchronized(lock) {
      //sync
    }
    //unsync
  }
}

代码B

public class MyClass2 {
  private final Object lock = new Object();
  public MyClass2() {
    //unsync
    synchronized(lock) {
      //sync
    }
    //unsync
  }
}

笔记

上面的代码显示了构造函数,但是您可以讨论静态方法和非静态方法中的行为是如何不同的。另外,在同步块修改静态成员变量时使用静态锁是否有利?

我已经看过了这个问题的答案,但是还不清楚不同的使用场景是什么。

共有1个答案

狄飞尘
2023-03-14

区别很简单:如果锁定的对象位于静态字段中,则MyClass*的所有实例都将共享该锁定(即,没有两个对象能够同时锁定该对象)。

如果字段是非静态的,那么每个实例都有自己的锁,因此只有对同一对象的方法调用才会相互锁定。

使用静态锁定对象时:

  • 线程1调用o1。foo()
  • 线程2调用o1。foo(),必须等待线程1完成
  • 线程3调用o2。foo(),还必须等待线程1(可能还有2)完成

使用非静态锁定对象时:

  • 线程1调用o1。foo()
  • 线程2调用o1。foo(),必须等待线程1完成
  • 线程3调用o2。foo()

你需要哪一个取决于你试图用同步块保护什么样的数据。

根据经验,您希望lock对象的static-ness与操作的on值相同。因此,如果仅操纵非静态值,则需要非静态锁定对象。如果仅操纵静态值,则需要静态锁对象。

当您操作静态和非静态值时,它将变得复杂。简单的方法是只使用静态锁对象,但这可能会增加同步块的大小,超出绝对需要,并且可能需要比预期更多的锁争用。在这些情况下,您可能需要静态和非静态锁定对象的组合。

在您的特定情况下,您在构造函数中使用锁,每个实例只会执行一次,所以非静态锁对象在这里没有任何意义。

 类似资料:
  • 通过下面的代码,我有A类的两个实例-a1和A2。并分别对这两个实例调用方法foo()。 在foo()方法中有一个synchronized块,它被锁定在调用对象上。由于这是一个实例级的锁定,这两个方法应该同时开始执行,因为它们是从两个独立的实例调用的。但是,他们被顺序执行。 这是因为,两个实例都是从同一个线程主调用的吗? 预期输出(应并行执行) 实际输出(按顺序执行)

  • 问题内容: 直到几周前,我还以为我知道何时创建字段和方法或。例如,当一个字段(例如另一个类的对象)对于该类的任意数量的对象是唯一的时,应将其设置为。 但是几周后,我读到了有关JVM垃圾收集的信息。 我知道字段永远不会被垃圾收集,并且始终保持在内存中,除非类加载器本身是垃圾收集的。 但是,如果我不创建该字段,至少它将被垃圾回收。 因此,在使字段/方法静态化与否之间似乎有一条 很细的界限 。 有人可以

  • 问题内容: 任何人都可以解释以下语句吗……“静态同步方法和非静态同步方法不会互相阻塞-它们可以同时运行” 问题答案: 锁定对象在静态方法和非静态方法上有所不同。静态方法将Class对象用作锁(锁obj:),而非静态方法将实例对象用作锁,此时方法的调用已绑定到该对象(锁obj:)。

  • 问题内容: Java教程说:“不可能在同一对象上两次调用同步方法。” 这对于静态方法意味着什么?由于静态方法没有关联的对象,所以synced关键字会锁定在类而不是对象上吗? 问题答案: 由于静态方法没有关联的对象, 所以synced关键字会锁定在类而不是对象上吗? 是。

  • 我有点困惑。请看看下面的代码。 我确信调用此序列是可能的。 虽然我仍然有一个小小的困惑,但我们可以很容易地看到也调用方法,这是一个静态方法。方法 是调用非同步静态方法的静态同步方法。当 thread-2 获得类级锁时,为什么从 Thread-1 调用 没有被阻止? 我只是在逻辑上感到困惑,如果一个线程获得类级锁定,则该类其他非同步静态方法保持打开状态,以便从其他方法(实例方法)调用。为什么?

  • 本文向大家介绍java synchronized同步静态方法和同步非静态方法的异同,包括了java synchronized同步静态方法和同步非静态方法的异同的使用技巧和注意事项,需要的朋友参考一下 java synchronized 详解 synchronized关键字有两种用法,一种是只用于方法的定义中,另外一种是synchronized块,我们不仅可以使用synchronized来同步一个对