java:单例的理解
2015-06-23 17:53
507 查看
前言:Java的单例经常用到,今天发现自己有一点新的认识。
这种方式是在第一次使用的时候进行一次单例的实例化,我以前也习惯用这种方式,却不曾想这是线程不安全的,后面会写实例证明。对于
这种方式在类创建的同时就进行了实例化,私有构造器仅仅被调用一次,这就保证它是安全的。
写法更快捷,我之前也未曾知道。
无偿地提供了序列化机制,绝对防止多次实例化,即使在面对复杂的序列化或者反射攻击的时候,无疑是最佳的singleton实现方式。—–effective Java一书
对于前面两种是有可能被借助
通过以上的方法进行测试,得出如下内容:
可以看出来懒汉式单例的确是不安全的,会创建多次实例,第二种和第三种是安全的。
总结:本文参考了J***A设计模式之单例模式博客,以及《effective Java 中文版》一书。
懒汉式单例
package com.mwq.singleton; public class Singleton1 { private Singleton1() { } private static Singleton1 single = null; public static Singleton1 getInstance() { if (single == null) { return new Singleton1(); } return single; } public String sayHello() { return "hello singleton1" + this; } }
这种方式是在第一次使用的时候进行一次单例的实例化,我以前也习惯用这种方式,却不曾想这是线程不安全的,后面会写实例证明。对于
private static Singleton1 single = null;为什么没有加final关键字,因为这种懒汉式写法与final无关!
饿汉式单例
package com.mwq.singleton; public class Singleton2 { private Singleton2() { } private static final Singleton2 single = new Singleton2(); public static Singleton2 getInstance() { return single; } public String sayHello() { return "hello singleton2" + this; } }
这种方式在类创建的同时就进行了实例化,私有构造器仅仅被调用一次,这就保证它是安全的。
枚举式单例
package com.mwq.singleton; public enum Singleton3 { INSTANCE; public String sayHello() { return "hello singleton3" + this; } }
写法更快捷,我之前也未曾知道。
无偿地提供了序列化机制,绝对防止多次实例化,即使在面对复杂的序列化或者反射攻击的时候,无疑是最佳的singleton实现方式。—–effective Java一书
对于前面两种是有可能被借助
setAcceessible()方法进行反射攻击的,但是我没有找到怎么避免?????
论证
package com.mwq.singleton; public class Test extends Thread{ public static void main(String[] args) { for (int i = 0; i < 10; i++) { new Thread(new Test()).start(); } } @Override public void run() { System.out.println(Singleton1.getInstance().sayHello()); System.out.println(Singleton2.getInstance().sayHello()); System.out.println(Singleton3.INSTANCE.sayHello()); System.out.println(); } }
通过以上的方法进行测试,得出如下内容:
hello singleton1com.mwq.singleton.Singleton1@1b1aa65 hello singleton2com.mwq.singleton.Singleton2@1125127 hello singleton3INSTANCE hello singleton1com.mwq.singleton.Singleton1@bb7465 hello singleton1com.mwq.singleton.Singleton1@2a5330 hello singleton2com.mwq.singleton.Singleton2@1125127 hello singleton3INSTANCE hello singleton2com.mwq.singleton.Singleton2@1125127 hello singleton3INSTANCE
可以看出来懒汉式单例的确是不安全的,会创建多次实例,第二种和第三种是安全的。
总结:本文参考了J***A设计模式之单例模式博客,以及《effective Java 中文版》一书。
相关文章推荐
- 《Java并发编程实践》笔记2——基础同步类
- 空服务器搭建java工程
- java多线程(同步和死锁,生产者和消费者问题)
- struts2源码分析--IOC容器的实现(操作以及容器的初始化)
- CAS和Shiro在spring中集成
- Java OutOfMemory 错误
- 【java设计模式】组合模式
- ofbiz,普通java程序,osgi中类加载
- Java基础知识小结 一(自学)
- Java类加载过程后,成员变量的初始化。
- java在string和int相互转化
- Force PhpStorm to Use Java JDK 1.8 on Yousemite
- Java基础之String
- JAVA 判断一个字符串是不是一个合法的日期格式
- java定义和实现接口
- Netty 权威指南之java 序列化
- Java多线程编程— 线程同步问题
- java通过封装编写Book类。要求:类具有属性书名、书号、主编、出版社、出版时间、页数、价格,其中页数不能少于200页,否则输出错误信息,并强制赋默认值200;为各属性设置赋值和取值方法;具有方法d
- 图片数据Base64编解码(java实现)
- java中的泛型