<span style="color: rgb(0, 176, 240); font-family: 黑体; mso-bidi-font-size: 10.0pt; mso-bidi-font-family: Consolas; mso-font-kerning: 0pt;"><span style="font-size:12px;">《剑指<span lang="EN-US">Offer</span>》<span lang="EN-US"><span style="font-size:14px;">P31</span></span></span></span><span style="font-family:宋体;font-size:14px;"> </span>
/*************实现单键模式Singleton*************/ public class Singleton { /* 简单实现方式一,不适合在多线程环境下使用 */ public class Singleton1 { //创建instance实例 private static Singleton1 instance; //构造函数设为private,即外界不可访问的 private Singleton1() { } //注意不能由构造函数创建对象,故只能使用类方法进行外界访问 public static Singleton1 getInstance() { if(instance == null)/*这里多环境下判断则容易出错,比如一个线程判断为null时,还未执行创建实例 另一个线程即立刻进行判断,此时结果仍为null,运行结果则会创建两个实例*/ { instance = new Singleton1(); } return instance; } } /*实现方法二,使用Lock锁方式*/ public final class Singleton { private static Singleton instance; //设置锁 private static Lock mylock = new ReentrantLock(); private Singleton() { } public static Singleton getInstance() { mylock.lock(); try { if(instance == null) { instance = new Singleton(); } return instance; } finally { mylock.unlock();//注意一定要在finally块中解锁 } } } /*实现方法三:由于上述每一次获取instance时都需要获取锁,花费时间过大,则这里适当做了优化,即只有第一次 创建才进行判断*/ public final class Singleton3 { private static Singleton3 instance; //设置锁 private static Lock mylock = new ReentrantLock(); private Singleton3() { } public static Singleton3 getInstance() { if(instance == null) { mylock.lock();//只有instance为null时,才立即上锁 try { if(instance == null)//注意这里要进行第二次判断 { instance = new Singleton3(); } } finally { mylock.unlock();//注意一定要在finally块中解锁 } } return instance; } } /*实现方法五*/ public final class Singleton4 { private static Singleton4 instance = new Singleton4();//立即初始化,但这样较浪费资源 private Singleton4() { } public static Singleton4 getInstance() { return instance; } } /*实现方法六*/ public final class Singleton6 { private Singleton6() { } public static Singleton6 getInstacne() { return Inner.instance; } private static class Inner { final static Singleton6 instance = new Singleton6(); } } public static void main(String[] args) { } }
原文:http://blog.csdn.net/woliuyunyicai/article/details/44651581