使用私有变量来锁定同步块

时间:2011-08-31 14:00:08

标签: variables locking block private synchronized

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

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”这个词来访问声明。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

在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的同步方法。

此致 Tiberiu