情侣网站建设策划书,刘涛给孩子网站做的广告,建设工程材料信息价查什么网站,佛山网站建设冯哥⭐ 作者#xff1a;小胡_不糊涂 #x1f331; 作者主页#xff1a;小胡_不糊涂的个人主页 #x1f4c0; 收录专栏#xff1a;JavaEE #x1f496; 持续更文#xff0c;关注博主少走弯路#xff0c;谢谢大家支持 #x1f496; 单例模式 1. 什么是单例模式2. 饿汉模式3.… ⭐ 作者小胡_不糊涂 作者主页小胡_不糊涂的个人主页 收录专栏JavaEE 持续更文关注博主少走弯路谢谢大家支持 单例模式 1. 什么是单例模式2. 饿汉模式3. 懒汉模式 1. 什么是单例模式
单例模式能保证某个类在程序中只存在唯⼀⼀份实例⽽不会创建出多个实例。 单例模式最常⻅的实现方式是“饿汉”和“懒汉”两种。
饿汉模式是在类加载的同时创建实例。懒汉模式在类加载时不创建实例只有第一次使用的时候才会创建实例。
就好比十只羊吃草饿汉模式就是直接让十只羊全部开吃而懒汉模式就是一个吃完下一个再吃。
2. 饿汉模式
class Singleton{private static Singleton instancenew Singleton();public static Singleton getInstance(){return instance;}private Singleton(){}
}
public class TestDemo6 {public static void main(String[] args) {Singleton sSingleton.getInstance();Singleton s1Singleton.getInstance();System.out.println(ss1);//true}
}该模式下的getInstance直接返回instance实例该操作是一个“读操作”对于多个线程读取同一个变量时此模式下的操作是线程安全的。
3. 懒汉模式
class SingleLazy{private static SingleLazy instancenull;//不立即创建实例public static SingleLazy getInstance(){if(instancenull){instancenew SingleLazy();}return instance;}private SingleLazy(){}
}该模式的实现是线程不安全的。 线程安全问题发⽣在⾸次创建实例时。如果在多个线程中同时调⽤ getInstance ⽅法就可能导致创建出多个实例就比如下面这种情况 想要改善该问题可以加上synchronized
class SingleLazy1{private static Object lokernew Object();private static SingleLazy1 instancenull;//volatile解决重排序问题public static SingleLazy1 getInstance() {synchronized (loker) {if (instance null) {instance new SingleLazy1();}}return instance;}private SingleLazy1(){}
}此时该代码已经没有线程安全问题了。
当instance已经创建过了后面再调用getInstance就应该是直接返回instance实例但是每次调用时仍会先加锁进入if中再解锁就会很麻烦降低了运行效率。而且加锁也就意味着可能会有阻塞一旦线程进入阻塞状态就不知道何时才能解除了。
所以在上述代码中可以加以改进直接在加锁之前先进行一次判空
class SingleLazy1{private static Object lokernew Object();private static volatile SingleLazy1 instancenull;//volatile解决指令重排序问题public static SingleLazy1 getInstance() {if(instancenull) {synchronized (loker) {if (instance null) {instance new SingleLazy1();}}}return instance;}private SingleLazy1(){}
}如果按照132顺序就会产生下面的错误所以为了避免该错误的发生就使用volatile来禁止指令的重排序。