`

java多线程对象锁与double check lock机制

    博客分类:
  • java
 
阅读更多
/**
 * 用于读取系统参数的工具类
 * 该工具类提供统一的方法读取系统参数,不管该参数是保存在配置文件还是数据库
 */
public class ConfigurationHelper
{
    private static final CPSLogger LOGGER = new CPSLogger(
            ConfigurationHelper.class);
    
    private static Map<String, ConfigurationProvider> cacheProviders 
            = new ConcurrentHashMap<String, ConfigurationProvider>();
    
    private static Object cacheProviderMaplock = new Object();

    private static ConfigurationProvider getProviderByCacheName(
            final String cacheName)
    {
        if (null == cacheName)
        {
            return null;
        }
        
        ConfigurationProvider provider = cacheProviders.get(cacheName);
        if (null == provider)
        {
            synchronized (cacheProviderMaplock)
            {
                provider = cacheProviders.get(cacheName);
                if (null == provider)
                {
                    final Map<String, ConfigurationProvider> beans = 
                            ContextRegistry.getContextHolder()
                            .getBeansOfType(ConfigurationProvider.class);
                    LOGGER.atFunction("Cache provider is not found, 
                            refresh provider map with beans",
                            cacheName,
                            beans);
                    if (null != beans)
                    {
                        for (final ConfigurationProvider bean : beans.values())
                        {
                            cacheProviders.put(bean.getName(), bean);
                        }
                    }
                    provider = cacheProviders.get(cacheName);
                    if (null == provider)
                    {
                        LOGGER.error("Cache provider is still not found, 
                                maybe it's undefined",
                                new Object[] { cacheName });
                    }
                }
            }
        }
        return provider;
    }
}

 

分享到:
评论

相关推荐

    java内存模型和一些多线程的资料

    为了确保多线程环境下数据的一致性,Java提供了多种同步机制,如synchronized、volatile、Lock接口(如ReentrantLock)、CountDownLatch、CyclicBarrier、Semaphore等。这些工具能有效控制线程的执行顺序,避免竞态...

    java多线程设计模式

    另一个例子是线程安全的单例模式,通过`synchronized`关键字或`Double-Check Locking`策略确保在多线程环境中正确地创建和访问单个实例。 在多线程编程中,同步是非常关键的概念。Java提供了多种同步机制,如`...

    java多线程设计模式详解+源码

    3. **线程同步**:为避免多线程环境中的数据不一致性,Java提供了多种同步机制,如synchronized关键字、Lock接口(ReentrantLock)、Semaphore信号量、CountDownLatch倒计时锁和CyclicBarrier同步屏障等。...

    NET面试题-多线程编程与线程同步1

    - 双检锁(Double-Check Locking)是一种避免线程安全问题的单例模式实现方式,它确保在多线程环境下只创建一个实例,同时减少不必要的锁同步开销。 10. **并发编程中的线程安全问题**: - 示例代码中的Parallel....

    java线程笔记

    在多线程环境下,实现线程安全的单例有几种方法:饿汉式(静态常量)、懒汉式(静态代码块)、双检锁/双重校验锁(DCL,Double-Check Locking)以及静态内部类。其中,DCL是最为推荐的方式,因为它结合了延迟初始化...

    java线程安全总结.pdf

    9. **Double-Check Locking(双重检查锁定)**:这是一种优化的单例模式实现,确保在多线程环境下只实例化一次对象,同时避免了同步的性能开销。 10. **静态工厂方法**:通过静态工厂方法创建线程安全的类实例,...

    Java并发编程:设计原则与模式(Concurrent.Programming.in.Java)(中英版)

    《Java并发编程:设计原则与模式》是一本深入探讨Java多线程编程的权威书籍,由Doug Lea撰写,第二版全面涵盖了Java并发处理的各个方面。这本书不仅提供了丰富的理论知识,还介绍了实战中的设计原则和模式,对于Java...

    Java并发编程的设计原则与模式

    3. **单例模式**:在多线程环境中,保证只有一个实例存在,通常使用双重检查锁定(Double-Check Locking)或静态内部类等方式实现。 4. **线程池模式**:通过ThreadPoolExecutor管理线程,可以有效控制并发数量,...

    Laravel开发-lock-laravel

    在Laravel框架中,"锁"机制是一种用于控制并发访问资源的重要工具,它确保了在多线程或分布式环境下的数据一致性与安全性。Laravel的锁功能主要通过数据库事务、Redis或其他分布式缓存系统实现,这使得开发者可以...

    项目开发中碰到的一个线程问题 (二)

    要避免这种情况,可以使用双检锁(Double-Check Locking)或其他线程安全的单例实现方式。 2. **同步访问**:如果反射操作涉及修改共享对象的状态,必须确保这些操作在同步块内进行。例如,使用synchronized关键字...

    java并发编程实战源码,java并发编程实战pdf,Java源码.zip

    - **Lock接口与ReentrantLock**:提供更细粒度的锁控制,如可重入锁、公平锁、非公平锁、读写锁等。 - **volatile**:确保变量的可见性,防止指令重排序,但不保证原子性。 3. **并发工具类** - **Executor框架*...

    计算机后端-Java-Java高并发从入门到面试教程-发课程资料.zip

    - **Double-Check Locking**:理解双重检查锁定模式,以及其在单例模式中的应用。 - ** volatile与synchronized的区别**:深入探讨两者的异同。 通过本课程的学习,开发者不仅能掌握Java并发编程的基础知识,还能...

    【Java面试资料】-(机构内训资料)上海-拼多多-Java高级

    - 类与对象:深入理解面向对象编程的基本概念,包括封装、继承和多态。 - 异常处理:学习如何正确使用try-catch-finally语句,理解和掌握Checked与Unchecked异常的区别。 - 内存管理:理解堆栈内存的概念,了解...

    java并发编程学习思维导图

    Java并发编程是Java开发中的重要领域,涉及到多线程、同步机制、线程池等多个核心概念,对于提高程序性能和系统资源利用率具有关键作用。在Java中,并发编程的实现主要依赖于Java语言的内置机制,如Thread类、...

    java面试题_高并发、高可用、分布式(9题)

    - **单例模式**:在多线程环境下,双重检查锁定(Double-Check Locking)是实现线程安全的单例模式。 5. **JVM优化** 面对高并发场景,优化JVM的性能至关重要。这包括调整内存分配(堆、栈、元空间等),设置垃圾...

    java高并发编程源码.zip

    Java高并发编程是Java开发中的重要领域,它涉及到如何在多线程环境下高效地管理和调度系统资源,以实现系统的高性能和可伸缩性。在这个"java高并发编程源码.zip"压缩包中,可能包含了一些关于Java并发编程的示例代码...

    单件模式下用的加锁(互斥)

    另一种常见的单件模式实现方式是双检锁/双重校验锁定(Double-Check Locking,DCL),这种方式在C#中通常结合`volatile`关键字使用,以避免无谓的同步开销: ```csharp using System; public class Singleton { ...

    详解C++实现线程安全的单例模式

    为了使懒汉模式在多线程环境中成为线程安全的单例,我们可以引入互斥锁(`pthread_mutex_t`)。在C++中,通常使用`std::mutex`,但在示例中使用了POSIX线程库`pthread`。当多个线程尝试访问`GetInstance()`时,只有...

    DCL常用设计方法

    总结来说,"DCL常用设计方法"主要关注如何在多线程环境中安全且高效地创建和管理单例对象。通过理解并应用双重检查锁定、volatile、延迟初始化以及其他的并发控制策略,开发者可以构建出更加健壮的并发应用程序。在...

    C++实现的单例模式代码

    DCL法在创建实例时引入了锁机制,确保了多线程环境下的线程安全。如下: ```cpp class Singleton { private: Singleton() {} ~Singleton() {} Singleton(const Singleton&) = delete; Singleton& operator=...

Global site tag (gtag.js) - Google Analytics