我在高并发系统中有一个类。该类的方法 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;
}
}
最佳答案
有几点值得注意:
我不认为
transient
关键字 means what you think it means 。该关键字与同步无关,仅在序列化类时使用。您可能会将其与volatile
混淆。顺便说一句,这里也不需要volatile
。单例的延迟初始化可能是不必要的。为什么不直接执行
private static final ClassUtils classUtils = new ClassUtils();
?那么你的 getInstance() 方法不需要同步,只需返回 classUtils;
它也是线程安全的。您还应该始终将单例实例声明为final
。不需要
getObjectLock()
的整个情况。您只需在this
上进行同步即可(即将getResolvedClassname
转换为synchronized
方法),这样会更安全、更干净。
您还可以研究java.util.concurrent.Lock
类,看看是否有比在Object
上同步更合适的东西,现在这被认为是糟糕的形式。
关于java - 高并发系统中的锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9418362/