[英]Thread synchronized block with Class itself
我認為以下用法是創建一個同步塊,因為ThreadMyClass.class
是唯一的。 但是,當我使用多個線程嘗試訪問get()
方法創建了繁忙的流量時,我發現創建了許多不一致的狀態。 那么,為什么線程不與ThreadMyClass.class
實例同步?
public ThreadMyClass {
public Object get(){
synchronized (ThreadMyClass.class) {
//get object return
}
}
}
public static final Object lock = new Object();
當我用lock
對象更改ThreadMyClass.class
時,一切工作正常。
更新:這是我的完整代碼部分實例創建塊被多次調用。
public static XmppInterface getInstance() throws XMPPException {
if (instance == null) {
synchronized (XmppInterface.class) {
if (instance == null) {
//create an instance
}
}
}
return instance;
}
好吧,您正在同步class
,而不是其實例,這等同於具有static synchronized
方法。
要同步類的實例,可以使用synchronized
實例方法。
否則,在用於鎖的Object
進行同步將僅在該Object
上進行同步,其余靜態方法和實例方法將從同步策略中“釋放”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.