publicclassA{//1.私有构造方法privateA(){}//2.未初始化的静态变量privatestatic A instance;//3.静态代码块,创建单例对象static{
instance =newA();}//4.共有的静态方法,返回实例对象publicstatic A getInstance(){return instance;}}
三、懒汉式线程不安全
1.优点
具有懒加载的效果,但是只能在单线程下使用
2.缺点
一个线程在进入判断语句还未来得及往下执行,另一个
线程也通过这个判断方法,这是就会产生多个实例。
3.代码示例
publicclassA{//1.私有构造方法privateA(){}//2.静态常量privatestatic A instancet;//3.if判断是否创建实例,有则不创建,无则创建publicstatic A getInstance(){if(instancet == null){
instancet =newA();}return instancet;}}
四、懒汉式线程安全
1.优点
具有懒加载的效果,并且线程安全。
2.缺点
效率太低
3.代码示例
publicclassA{//1.私有构造方法privateA(){}//2.静态常量privatestatic A instancet;//3.方法使用synchronized修饰,逻辑为if判断是否创建实例,有则不创建,无则创建publicstaticsynchronized A getInstance(){if(instancet == null){
instancet =newA();}return instancet;}}
五、懒汉式线程安全同步代码块
1.优点
对第四种方法的改造,但是没起到作用。
2.缺点
不具备线程安全。
3.代码示例
publicclassA{//1.私有构造方法privateA(){}//2.静态常量privatestatic A instancet;//3.if判断是否创建实例,有则不创建,无则创建publicstatic A getInstance(){if(instancet == null){synchronized(A.class){
instancet =newA();}}return instancet;}}
六、双重检查
1.优点
进行二次if判断,保证了线程安全。延迟加载,效率高。
2.缺点
不简洁。
3.代码示例
publicclassA{//1.私有构造方法privateA(){}//2.静态常量,使用volatile可见性修饰privatestaticvolatile A instancet;//3.if判断是否创建实例,有则不创建,无则创建,//之后再同步代码块中再次if判断publicstatic A getInstance(){if(instancet == null){synchronized(A.class){if(instancet == null){
instancet =newA();}}}return instancet;}}
七、静态内部类
1.优点
具备安全,懒加载特性。
2.代码示例
publicclassA{//1.私有构造方法privateA(){}//2.内部类,创建对象privatestaticclassB{privatefinalstatic A INSTANCE =newA();}//3.静态方法通过内部类返回对象。publicstatic A getInstance(){return B.INSTANCE;}}