java中安全的单例与不安全的单例

1.内部静态类(安全的)

public class Singleton {
private static class SingletonHolder{
private final static Singleton instance=new Singleton();
} public static Singleton getInstanceStaticInnerClass(){
return SingletonHolder.instance;
}
}

2.饿汉模式(安全的)

利用静态类的加载构成的天然线程安全的单例
这就是饥饿模式,不管是否用到都创建对象,如果对象太大会造成内存浪费。 public class Singleton {
private static Singleton safeSingleton=null; static {
safeSingleton=new Singleton();
} public static Singleton getInstanceSafe(){
return safeSingleton;
}
}

3.懒汉模式(不安全)

因为饿汉模式在对象不被使用时会浪费内存,因此可以在使用时再创建对象。

但是在多线程中不安全,因为在new时对象具有不可见性

public class Singleton {
private static Singleton singleton=null;
private Singleton(){ }
public static Singleton getInstanceSimpleLazy(){
if(singleton==null){
singleton=new Singleton(); }
return singleton;
}
}

4.双检锁(不安全)

//双检锁
//双检锁的问题:多线程中可能会返回一个未被初始化完毕的对象。
//原因:初始化对象的步骤是 1.为对象分配内存 2.初始化对象 3.将对象指向singleton
//由于2依赖于1,1,2不会被重排序。2,3没有依赖性可能会被重排序。也就是说可能会先将一个null的对象指向singleton,而此时该对象又正在被初始化。
//假设此时另外一个线程来访问singleton,那么就会返回一个null对象 public class Singleton {
private static Singleton singleton=null;
private static Object ob=new Object();
private Singleton(){ }
public static Singleton getInstanceDoubleCheck(){
if(singleton==null){
synchronized(ob){
if(singleton==null){
singleton=new Singleton();
}
}
}
return singleton;
}
}

5.枚举(安全的,建议使用)

调用方法:Factory.INSTANCE.getResource
INSTANCE: 是被static final声明了的Factory 的实例。
enum的申明: public abstract class Enum<E extends Enum<E>>
implements Comparable<E>, Serializable class Resource{ } public enum Factory{
INSTANCE;
private Resource resource;
Factory(){
resource=new Resource();
} public Resource getResource(){
return resource;
} }

最新文章

  1. 《Effective java》-----读书笔记
  2. CSS3-03 样式 2
  3. setAutoCommmit保持数据的完整性
  4. iOS开发Swift篇(02) NSThread线程相关简单说明
  5. 使用BAT批处理执行sql语句的代码
  6. [转]EntityFramework走马观花之CRUD(中)
  7. UVa 1394 约瑟夫问题的变形
  8. 基于.net mvc的校友录(七、文件上传以及多对多关系表的LINQ查询实现)
  9. 提供给开发者 10 款最好的 Python IDE
  10. structs spring hibernate 三者之间有什么关系?
  11. location查询字符串解析
  12. Eclipse文件覆盖问题
  13. JDK 中的设计模式应用实例
  14. 小程序 movable-area 实现悬浮窗效果
  15. 利用百度API(js),怎样通过地址获取经纬度
  16. js-闪烁的文字
  17. 《Python》网络编程之验证客户端连接的合法性、socketserver模块
  18. Android 数据存储03之SQLite
  19. ASP.NET中将数据作为XML数据发送 使用 Request.InputStream 接收
  20. DIV+CSS实战(五)

热门文章

  1. C#实现某一属性值变化时触发事件
  2. mysql重启遇到的问题
  3. HashSet源码分析:JDK源码系列
  4. 《深入理解 Java 内存模型》读书笔记
  5. Kafka工作流程分析
  6. 2019牛客多校第二场D-Kth Minimum Clique
  7. c语言的strcpy函数
  8. Angular JS 中的内置方法之$watch
  9. 数据类型之Integer与int
  10. 使用eclipse编写和运行java程序(基础)