不安全的延时初始化:

/**
 * 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 {
    }
}
线程not-safe说明:
【并发编程】延时初始化

安全的延时初始化
/**
 * 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;
    }
}















相关文章:

  • 2021-12-18
  • 2021-11-17
  • 2021-11-25
  • 2021-10-31
  • 2021-05-21
  • 2021-09-24
  • 2021-11-17
猜你喜欢
  • 2021-12-04
  • 2021-05-06
  • 2022-01-13
  • 2021-11-17
  • 2021-07-13
  • 2021-07-11
  • 2021-08-23
  • 2021-10-21
相关资源
相似解决方案