【发布时间】:2012-02-23 17:48:31
【问题描述】:
我在一个高度并发的系统中有一堂课。该类的方法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;
}
}
【问题讨论】:
-
其他人可能不同意,但我认为这个问题有点太模糊,无法提供有用的答案。
-
private transient Object object- 不应该是final吗? -
让你的锁
final,不是暂时的。删除它的getter(直接在方法中使用属性)。您的单例初始化方法已损坏,请使用双重锁定检查或枚举。有关更复杂的锁类型,请参阅此页面:- docs.oracle.com/javase/6/docs/api/java/util/concurrent/locks/… -
同意,它应该是最终的,而且因为它是私有的,所以不需要私有 getter。
标签: java concurrency locking deadlock