关于Java单例
2015-08-06 22:02
579 查看
参考资料:/article/2551899.html
View Code
public class SingletonTest implements Runnable { static SingletonClass1 instance = null; public static void main(String args[]) { // SingletonClass0 instance = new SingletonClass0();// The constructor // SingletonClass0() is not visible for (int i = 0; i < 15; i++) { new Thread(new SingletonTest()).start(); } // System.out.println(instance.getClass()); } @Override public void run() { // TODO Auto-generated method stub SingletonClass6.getInstance(); // System.out.println(SingletonClass7.instance.hashCode()); } } class SingletonClass0 { private static SingletonClass0 instance = null; private SingletonClass0() { System.out.println("constructor run"); } public static SingletonClass0 getInstance() {// wrong 单线才单线程下没问题,多线程下仍会有多个实例 if (instance == null) { instance = new SingletonClass0(); System.out.println(instance.hashCode()); } return instance; } } class SingletonClass1 { private static SingletonClass1 instance = null; private SingletonClass1() { System.out.println("constructor run"); } public static SingletonClass1 getInstance() {// wrong 多线程下仍会有多个实例,与上一种 // 区别在于过个线程的new过程被同步了 if (instance == null) { synchronized (SingletonClass1.class) { instance = new SingletonClass1(); System.out.println(instance.hashCode()); } } return instance; } } class SingletonClass2 { private static SingletonClass2 instance = null; private SingletonClass2() { System.out.println("constructor run"); } public static SingletonClass2 getInstance() { synchronized (SingletonClass2.class) {// right。只会有一个线程new实例,但阻碍了后续线程读实例 if (instance == null) { instance = new SingletonClass2(); System.out.println(instance.hashCode()); } } return instance; } } class SingletonClass3 { private static SingletonClass3 instance = null; private SingletonClass3() { System.out.println("constructor run"); } public static SingletonClass3 getInstance() { synchronized (SingletonClass3.class) {// right // 只会有一个线程new实例,不会影响后续线程读实例,但instance=new // SingletonClass3()在JVM内不是原子操作,内部的几个步骤可能乱序,从而出错 if (instance == null) { synchronized (SingletonClass1.class) { if (instance == null) { instance = new SingletonClass3(); System.out.println(instance.hashCode()); } } } } return instance; } } class SingletonClass4 { private static volatile SingletonClass4 instance = null;// right // 只有一个实例,volatite保证了在JVM内部new // instance的几个操作禁止指令重排序优化 private SingletonClass4() { System.out.println("constructor run"); } public static SingletonClass4 getInstance() { synchronized (SingletonClass4.class) { if (instance == null) { synchronized (SingletonClass1.class) { if (instance == null) { instance = new SingletonClass4(); System.out.println(instance.hashCode()); } } } } return instance; } } class SingletonClass5 {// right,但是由类加载器在类加载时创建实例,我们无法控制实例创建的时机以干一些事(比如某个配置文件,或是某个被其它类创建的资源) public volatile static SingletonClass5 instance = new SingletonClass5(); private SingletonClass5() { System.out.println("constructor run"); }; public static SingletonClass5 getInstance() { System.out.println(instance.hashCode()); return instance; } } class SingletonClass6 {// 仍然使用JVM本身机制保证了线程安全问题;由于 SingletonHolder 是私有的,除了 // getInstance() // 之外没有办法访问它,因此它只有在getInstance()被调用时才会真正创建;同时读取实例的时候不会进行同步,没有性能缺陷;也不依赖 // JDK 版本 private static class SingletonHolder { private static final SingletonClass6 INSTANCE = new SingletonClass6(); } private SingletonClass6() { System.out.println("constructor run"); } public static final SingletonClass6 getInstance() { System.out.println(SingletonHolder.INSTANCE.hashCode()); return SingletonHolder.INSTANCE; } } class SingletonClass7 { public SingletonClass7() { System.out.println("constructor run"); } } enum SingletonClass { instance; }
View Code
相关文章推荐
- Puzzler: Nested computeIfAbsent -Java 8
- JAVA技术交流群
- Struts2知多少(2) Struts2 是什么
- Java机试题目_怎样截取字符串
- 关于eclipse生成web工程的时候没有web.xml文件的解决方案
- Java汉字转换为拼音
- Spring的Ioc(控制反转)和DI(依赖注入)
- 理解Java的IO流 2015年8月6日 21:30:38
- Java实现算法之--二分查找法
- Win7环境下用MyEclipse搭建Hbase开发环境
- Java实现算法之--求子数组和的最大值
- 用dom4j解析xml 报java.lang.NoClassDefFoundError:org/jaxen/JaxenException
- 【Java】Java处理double相加的结果异常
- JDK动态代理机制
- Spring注解详解
- myeclipse 提示No Default Proposals 或 no completions available 的解决方法
- 解决Opentaps/OFBiz在Eclipse启动时"Could not load VFS configuration"的问题
- 解决ofbiz在myeclipse中调试运行时报错:Can't find bundle for base name cache
- java设计模式(9) - 适配器模式
- java中进行二进制,八进制,十六进制,十进制间进行相互转换