【问题标题】:using a private variable for the lock of synchronized block使用私有变量来锁定同步块
【发布时间】:2011-08-31 14:00:08
【问题描述】:

嗨,我正在研究线程并用它们实现一些简单的示例。另外,我知道如何锁定和使用同步语句,但我看到了一个这样的例子;

private List<Foo> myList = new ArrayList<Foo>();
private Map<String,Bar) myMap = new HashMap<String,Bar>();

public void put( String s, Bar b ) {
  synchronized( myMap ) {
    myMap.put( s,b );
    // then some thing that may take a while like a database access or RPC or notifying listeners
  }
}

那么如何以及为什么可以将变量用作同步块的锁_?。我总是使用“this”这个词来访问语句。

【问题讨论】:

    标签: variables locking block private synchronized


    【解决方案1】:

    您可以使用任何不具有弱标识的引用类型来锁定代码块。通常使用this 指针。但是你是否应该使用成员变量取决于你的类的行为。

    例如,如果您有四个方法,其中两个使用var1,另外两个使用var2。现在如果您只想根据这些变量同步这些方法,那么您可以选择使用变量来锁定而不是this

    【讨论】:

      【解决方案2】:

      在 Java 中,每个对象实例都有一个与之关联的锁。 您需要对象的引用才能执行同步块语句。 没有必要对同步块使用相同的对象。你会很好的:

      private Map<String,Bar) myMap = new HashMap<String,Bar>();
      private Object lockObj = new Object();
      
      public void put( String s, Bar b ) {
        synchronized( lockObj ) {
          myMap.put( s,b );
          // then some thing that may take a while like a database access or RPC or notifying listeners
        }
      }
      

      但现在的诀窍是确保在访问 myMap 对象时使用相同的对象。 因此,使用您操作的同一个对象来充当锁是一个好习惯。 当您想要做一个小的同步块并且不为它创建一个新对象时使用它。这将很好地工作。 希望对你理解java的同步方式有所帮助。

      问候, 提比略

      【讨论】:

      • 好吧,这对我来说是最清晰易懂的信息:)。感谢您的帮助
      【解决方案3】:

      this是一个指向当前对象的指针,但是myMap也是一个对象,是实现了Serializable接口的HashMap类的一个实例

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-13
        • 1970-01-01
        • 1970-01-01
        • 2011-08-17
        • 1970-01-01
        • 2018-03-05
        • 1970-01-01
        相关资源
        最近更新 更多