标签:
单例设计模式是常见的设计模式之一。通过单例实现所需求类在系统中只存在唯一一个实例。
单例设计模式分两种:懒汉单例设计模式和饿汉单例设计模式,两者设计思路一致,实现有微小不同。
实现代码:
1 public class HungryMan { 2 3 private HungryMan(){};//私有的构造方法保证HungryMan类无法在外部使用构造方法实例化 4 private static final HungryMan hungryMan=new HungryMan();//在类内定义一个实例,这个是单例设计模式中保证的唯一的实现对象 5 public static HungryMan getInstance(){//定义一个静态方法获取唯一的实现对象 6 return hungryMan; 7 } 8 9 }
在main中实现
1 public class Demo { 2 public static void main(String[] args) { 3 4 HungryMan hungryMan=HungryMan.getInstance(); 5 HungryMan hungryMan2=HungryMan.getInstance(); 6 //HungryMan hungryMan3=new HungryMan(); 编译错误,因为构造方法不可见 7 System.out.println(hungryMan.equals(hungryMan2));//验证获得的两个实例是否为同一实例,结果为true 8 } 9 }
这是懒汉单例设计模式,最后一步验证了两个实例是否为同一实例。
饿汉单例设计模式:
1 public class LazyMan { 2 3 private LazyMan() { 4 }; 5 6 private static LazyMan lazyMan; 7 8 public static LazyMan getInstance() {//判断实例是否存在,存在直接返回,不存在则创建并初始化 9 if (null == lazyMan) { 10 lazyMan = new LazyMan(); 11 } 12 return lazyMan; 13 } 14 15 }
建议使用饿汉式的设计方式,因为上面的那种设计方式存在着线程安全问题,只有单个线程进行访问的时候是没有问题的,但是当有多个线程并发访问的时候,就会出现线程安全问题:可能会出现多次创建实例对象的情况(后面创建的实例会把前面创建的实例覆盖)。
线程安全问题:
1 public class DemoThread extends Thread { 2 @Override 3 public void run() { 4 LazyMan lazyMan = LazyMan.getInstance(); 5 /* 6 * if (null == lazyMan) { //当到这一步的线程争夺中会出现安全问题 7 * lazyMan = new LazyMan(); } 8 * return lazyMan; 9 * 10 */ 11 } 12 }
在进入判断实例是否存在完成时,不同线程抢走执行权再次判断结果为true会造成创建多个lazyMan对象。
标签:
原文地址:http://www.cnblogs.com/pizzabig/p/5440797.html