首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高并发系统中的锁定

高并发系统中的锁定
EN

Stack Overflow用户
提问于 2012-02-23 17:48:31
回答 3查看 242关注 0票数 0

我在一个高度并发的系统中有一门课。该类的getResolvedClassName()方法可以产生死锁。因此,我设计它的方式如下:

代码语言:javascript
复制
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;
    }   
}

我这样做对吗?任何信息都会对我有帮助。

谢谢。

编辑:

代码语言:javascript
复制
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;
    }   
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-23 18:11:06

有几件事特别突出:

  1. 我不认为transient关键字means what you think it means。该关键字与同步无关,仅在序列化类时使用。您可能会将其与volatile混淆。顺便说一句,这里也不需要volatile,您的单例的
  2. 延迟初始化可能是不必要的。你为什么不直接做private static final ClassUtils classUtils = new ClassUtils();呢?然后,您的getInstance()方法不需要同步,只需要return classUtils;,它也是线程安全的。您还应该始终将单例实例声明为final.
  3. The,不需要使用getObjectLock()。您可以在this上同步(即使getResolvedClassname成为synchronized方法),这样会更安全和更干净。

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

票数 3
EN

Stack Overflow用户

发布于 2012-02-23 17:57:08

这个问题确实有点模糊,我看不出使用单例的目的,以及为什么需要同步才能完成一些工作。如果不访问可变状态,则不需要同步。我只能说,三个锁(ClassUtils.classClassUtils实例和object)几乎肯定增加了不必要的复杂性。此外,正如贾斯汀所指出的,您应该最终完成object,然后就不需要同步来访问它了。

票数 3
EN

Stack Overflow用户

发布于 2012-02-23 17:53:28

你的问题有点笼统。但是,您可以考虑将该值初始化为不可变。许多不可变的初始化值是线程安全,不需要锁定。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9418362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档