互联网站建设维护需要做什么,佳木斯建设网站,绍兴专门做网站的公司,成都网站建设公司兴田德润在哪儿一、描述
单例模式就是程序中一个类只能有一个对象实例
举个例子:
//引出单例模式#xff0c;一个类中只能由一个对象实例
public class Singleton1 {private static Singleton1 instance new Singleton1();//通过这个方法来获取实例public static Singleton1 getInstance…一、描述
单例模式就是程序中一个类只能有一个对象实例
举个例子:
//引出单例模式一个类中只能由一个对象实例
public class Singleton1 {private static Singleton1 instance new Singleton1();//通过这个方法来获取实例public static Singleton1 getInstance() {return instance;}//把构造方法设置私有防止创建多个线程private Singleton1() {}
}
public class Test1{public static void main(String[] args) {Singleton1 s1 new Singleton1();}
}
这样写Test1类中Singleton1 s1 new Singleton1();会报错因为我们在Singleton1中把构造方法设置了私有 二、单例模式分类
1、饿汉模式
开始我就先给创建出这个实例并且赋值分配空间代码如下
public class Singleton1 {private static Singleton1 instance new Singleton1();//通过这个方法来获取实例public static Singleton1 getInstance() {return instance;}
}
2、懒汉模式
在开始不创建这个实例在第一次调用这个类的时候在创建实例这样随用随分配空间代码如下
public class Singleton2 {private static Singleton2 instance null;//通过这个方法来获取实例public static Singleton2 getInstance() {if(instancenull){instancenew Singleton2();}return instance;}//把构造方法设置私有防止创建多个线程private Singleton2() {}
}
三、懒汉模式的代码问题
问题一
这是多线程如果有两个线程分别是a和ba开始调用这个类的时候instancenull开始创建实例instance同时b线程在a还有没有创建完instance的时候也开始调用这个类判断条件是同样instancenull也开始创建实例当两个线程都执行完就创建了两个实例违背了单例模式这是bug!!! 问题一解决方案
其实很简单我们只需要引入锁就可以保证判断instancenull和new的对象是一起执行或者都不执行就可以了代码如下
public class soltion1 {private static soltion1 instance null;static Object objectnew Object();//通过这个方法来获取实例public static soltion1 getInstance() {synchronized (object){if(instancenull){instancenew soltion1();}}return instance;}//把构造方法设置私有防止创建多个线程private soltion1() {}
}
有个新的问题如果a线程创建了instance但是以后的线程都要加锁这就造成了cpu创建锁的负担这是问题二 问题二解决方案
我们只要保证instance为空的时候进来是需要加锁的别的时候再进来就不用加锁了
public class soltion1 {private static soltion1 instance null;static Object objectnew Object();//通过这个方法来获取实例public static soltion1 getInstance() {if(instancenull){//这个if是判断instance是否为空synchronized (object){if(instancenull){//这个if是判断时候new新的对象instancenew soltion1();}}}return instance;}//把构造方法设置私有防止创建多个线程private soltion1() {}
}
到这里我们已经解决了大部分问题了但是new创建对象的时候是有三部曲
申请内存空间在内存空间上构造对象把内存的地址赋值给instance引用 上述描述这是问题三
问题三解决方案
加volatile保证instance再修改时不会出现指令重排序情况
private volatile static soltion1 instance null;
总结
public class soltion1 {private volatile static soltion1 instance null;static Object objectnew Object();//通过这个方法来获取实例public static soltion1 getInstance() {if(instancenull){//这个if是判断instance是否为空synchronized (object){if(instancenull){//这个if是判断时候new新的对象instancenew soltion1();}}}return instance;}//把构造方法设置私有防止创建多个线程private soltion1() {}
}