并发编程延时初始化

Posted ssslinppp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发编程延时初始化相关的知识,希望对你有一定的参考价值。

不安全的延时初始化:

/**
 * Unsafe lazy initialization
 */
@NotThreadSafe
public class UnsafeLazyInitialization {
    private static Resource resource;

    //resource的赋值可能和Resource()域的赋值 顺序重排序
    public static Resource getInstance() {
        if (resource == null)
            resource = new Resource(); // unsafe publication
        return resource;
    }
    static class Resource {
    }
}

安全的延时初始化
/**
 * Thread-safe lazy initialization
*/
@ThreadSafe
public class SafeLazyInitialization {
    private static Resource resource;
    public synchronized static Resource getInstance() {
        if (resource == null)
            resource = new Resource();
        return resource;
    }
    static class Resource {
    }
}


安全的延时初始化
延时初始化占位符模式--使用static初始化--不需要显示的同步
/**
 * Lazy initialization holder class idiom
 */
@ThreadSafe
public class ResourceFactory {
    private static class ResourceHolder {
        //使用static静态初始化(关键)
        public static Resource resource = new Resource();
    }
    //当任何一个线程在首次调用getResource()时,都会使ResourceHolder被加载和被初始化
    public static Resource getResource() {
        return ResourceFactory.ResourceHolder.resource;
    }
}















以上是关于并发编程延时初始化的主要内容,如果未能解决你的问题,请参考以下文章

JUC并发编程 共享模式之工具 ThreadPoolExecutor -- 任务调度线程池 定时任务 / 延时执行(Timer的缺点)

并发编程(十四)—— ScheduledThreadPoolExecutor 实现原理与源码深度解析 之 DelayedWorkQueue

Java并发编程:并发容器之CopyOnWriteArrayList

并发编程之定时任务

Java并发编程:并发容器之CopyOnWriteArrayList(转载)

Java并发编程 - ScheduledExecutorService