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 - 如何使用和测试等待和通知

Java FOR 循环递增并将新变量传递给方法

java - 所有提供者之后的 Spring Security java.lang.StackOverflowError 异常

java - 线程完成时是否发出通知信号?为什么此代码示例有效?

java - 对可变对象使用 volatile 关键字

c# - 在任何情况下,在 ReaderWriterLockSlim 上调用 EnterWriteLock 应该进入读锁吗?

data-structures - 用Rust进行交接锁定

multithreading - LOCK 前缀与 MESI 协议(protocol)?

java - MongoDb 3.0.1 java驱动程序GridFs错误

scala - akka actor适用于搜索等在线服务系统吗?