我有一個高併發系統類。該類的方法getResolvedClassName()
可能會產生死鎖。所以我用以下方式設計它:高併發系統鎖定
public class ClassUtils {
private static ClassUtils classUtils;
private transient Object object = new Object();
private synchronized Object getObjectLock() {
return object;
}
public void getResolvedClassName(Class<?> clazz) {
synchronized (getObjectLock()) {
//some job will be done here
}
}
public synchronized static ClassUtils getInstance() {
if(classUtils == null) {
classUtils = new ClassUtils();
}
return classUtils;
}
}
我是否正確地做到了這一點?任何信息都會對我有所幫助。
謝謝。
編輯:
public class ClassUtils {
private static final ClassUtils classUtils = new ClassUtils();
private ReentrantLock lock = new ReentrantLock();
public void getResolvedClassName(Class<?> clazz) {
lock.lock();
//some job will be done here
lock.unlock();
}
public static ClassUtils getInstance() {
return classUtils;
}
}
其他人可能會不同意,但我認爲這個問題有點太模糊,不允許有用的答案。 – NPE 2012-02-23 17:50:50
'私人臨時對象對象' - 不應該是'final'而是? – 2012-02-23 17:52:55
使你的鎖'最終',而不是瞬態。刪除它的getter(直接在方法中使用該屬性)。您的單例初始化方法被破壞,使用雙重鎖定檢查或枚舉。看到這個頁面的更復雜的鎖類型: - http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/locks/package-summary.html – Perception 2012-02-23 17:56:33