2011-08-31 22 views
0

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

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 
    } 
} 

所以如何以及为什么可以是一个变量用作锁定同步的block_ ?.我总是用这个词来访问这个语句。

回答

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

Regards, Tiberiu

+0

好友,这是我最清楚,最容易理解的信息:)。谢谢你的帮助 – quartaela

1

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

2

您可以使用不具有弱的身份锁定任何引用类型一块代码。使用指针this是一种惯例。但是否应该使用成员变量取决于您的类的行为。

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

+0

这对我很有帮助。谢谢:) – quartaela