java - 高并发系统中的锁定

标签 java concurrency locking deadlock

我在高并发系统中有一个类。该类的方法 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;
    }   
}

最佳答案

有几点值得注意:

  1. 我不认为 transient 关键字 means what you think it means 。该关键字与同步无关,仅在序列化类时使用。您可能会将其与 volatile 混淆。顺便说一句,这里也不需要 volatile

  2. 单例的延迟初始化可能是不必要的。为什么不直接执行private static final ClassUtils classUtils = new ClassUtils();?那么你的 getInstance() 方法不需要同步,只需返回 classUtils; 它也是线程安全的。您还应该始终将单例实例声明为final

  3. 不需要 getObjectLock() 的整个情况。您只需在 this 上进行同步即可(即将 getResolvedClassname 转换为 synchronized 方法),这样会更安全、更干净。

您还可以研究java.util.concurrent.Lock类,看看是否有比在Object上同步更合适的东西,现在这被认为是糟糕的形式。

关于java - 高并发系统中的锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9418362/

相关文章:

java - 为什么 AbstractQueuedSynchronizer 在获取锁时中断

java - 优化 HibernateTemplate 的数据插入

java - Dagger 2在提供方法中使用命名注释

java - 向现有 @Entity 添加新字段时出现 SQLException (jpa)

java - 如何并发素数分解?

google-apps-script - 如何为 Google Apps Script Webapp 上的并发用户提供便利?

java - 在该行中搜索文本时如何返回该行

python - 基于 python 的 webapp 中的并发处理

rust - 优雅地处理 SIGTERM (Ctrl-c) 并关闭线程池

android - 如何创建图案锁定应用程序