我在高度并发的系统中有一个类。该类的方法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()方法不需要同步,只需return classUtils;也是线程安全的。您还应该始终将单例实例声明为final
getObjectLock()不需要整个情况。您可以在this上进行同步(即将getResolvedClassname转换为synchronized方法),这样会更安全,更干净。


您还可以研究java.util.concurrent.Lock类,以查看是否有比在Object上进行同步更合适的方法,而在当今看来,却是较差的形式。

10-08 11:55