并发编程延时初始化
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