是否使用atomicreference正确实现了延迟初始化单例?如果不是 – 可能的问题是什么?
import java.io.ObjectStreamException; import java.io.Serializable; import java.util.concurrent.atomic.atomicreference; public class Singleton implements Serializable { private static final Singleton _instance = new Singleton(); private static atomicreference<Singleton> instance = new atomicreference<Singleton>(); private Singleton() { } public static Singleton getInstance() { if (instance.compareAndSet(null,_instance)) { synchronized (_instance) { _instance.init(); instance.set(_instance); } } return instance.get(); } private void init() { // do initialization } private Object readResolve() throws ObjectStreamException { return getInstance(); } }
解决方法
不,这很糟糕:
public static Singleton getInstance() { // new "singleton" for every method call Singleton s = new Singleton(); ^^^^^^^^^^^^^^ if (instance.compareAndSet(null,s)) { synchronized (s) { s.init(); } } return instance.get(); }
使用atomicreference是一个不错的主意,但它不起作用,因为Java没有懒惰的评估.
经典的1.5单例方法是:
渴望单身人士:
public final class Singleton{ private Singleton(){} private static final Singleton INSTANCE = new Singleton(); public Singleton getInstance(){return INSTANCE;} }
懒惰单身人士,内部持有人类:
public final class Singleton{ private Singleton(){} private static class Holder{ private static final Singleton INSTANCE = new Singleton(); } public Singleton getInstance(){return Holder.INSTANCE;} }
Enum Singleton:
public enum Singleton{ INSTANCE; }
你应该坚持使用其中一个
原文地址:https://www.jb51.cc/java/121706.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。