新手,初次学习,感觉有所领会,如有不足或者理解偏差,请指正。
2018年4月12日
10:13
注意要点
1.一个私有的静态变量
2.一个私有的构造器
3.一个公有的静态方法
· 普通构造器
package singleton; public class CommonSingleton { private static CommonSingleton instance;//一个静态变量 private CommonSingleton() { // 一个私有的构造器 } public static CommonSingleton getSingleton(){//一个静态方法 if(instance==null){ instance=new CommonSingleton(); } return instance; } }
· 带有同步锁的构造器
1.因为多线程并发访问时有可能导致创建的实例并不单一(只在初次创建实例的时候会引发这个问题),所以同步锁的作用就是每次只允许一个线程对该方法的访问,保证了单例,但由于创建实例只有一次,同步锁却每次访问都起作用,所以也很大程度限制了多线程的执行效率,使性能降低。
package singleton; public class SynchronizedSingleton { private static SynchronizedSingleton instance; private SynchronizedSingleton() { } public static synchronized SynchronizedSingleton getSingleton(){ if(instance==null){ instance=new SynchronizedSingleton(); } return instance; } }
· 初始化创建
在jvm加载此类的时候就马上创建实例,好处是解决了多线程可能重复创建实例的问题,不过这增加了应用程序初始化过程中的负担(对于需要初始化负担不重的程序很适用)
package singleton; public class InitSingleton { private static InitSingleton instance=new InitSingleton(); private InitSingleton() { } public static InitSingleton getSingleton(){ return instance; } }
· 双重检查锁
对于既要解决多线程访问可能导致单例重复创建问题,又不想直接加锁(导致并发时性能降低),而且初始化时创建又占用系统初始化资源,所以这是一个适合的解决办法。
package singleton; public class DoubleCheckSingleton { private volatile static DoubleCheckSingleton instance; private DoubleCheckSingleton() { } public static DoubleCheckSingleton getSingleton(){ if(instance==null){ synchronized (DoubleCheckSingleton.class) { if(instance==null){ instance=new DoubleCheckSingleton(); } } } return instance; } }