烟台网站搭建,wordpress自建表格,图片网站如何优化,百度搜索框 wordpress设计模式—创建型模式之单例模式
介绍
单例模式说明#xff1a;一个单一的类#xff0c;负责创建自己的对象#xff0c;同时确保系统中只有单个对象被创建。
单例模式特点#xff1a;
某个类只能有一个实例#xff1b;#xff08;构造器私有#xff09;它必须自行创…设计模式—创建型模式之单例模式
介绍
单例模式说明一个单一的类负责创建自己的对象同时确保系统中只有单个对象被创建。
单例模式特点
某个类只能有一个实例构造器私有它必须自行创建这个实例自己编写实例化逻辑它必须自行向整个系统提供这个实例对外提供实例化方法
单例模式图示如下 饿汉式
饿汉式比较简单代码如下
public class SingletonObject {private final static SingletonObject obj new SingletonObject();private SingletonObject() {System.out.println(创建了单例对象);}public static SingletonObject getInstance() {return obj;}
}懒汉式—效率低下实现方式1线程安全
获取实例的方法是static的我们可以给整个方法加一个锁这样锁的对象是整个类可以保证线程安全
代码实现如下
public class SingletonObject {//懒汉式private static SingletonObject obj;//保证构造器私有外部不能实例化private SingletonObject() {System.out.println(创建了单例对象);}//这种锁粒度太大导致效率低public static synchronized SingletonObject getInstance() {//懒汉式如果没有再去创建if(obj null) {obj new SingletonObject();}return obj;}
}懒汉式—效率低下实现方式2线程安全
我们可以不给整个方法加锁可以给如下代码块加锁但是这样的方式效率还是低
public class SingletonObject {//懒汉式private static SingletonObject obj;//保证构造器私有外部不能实例化private SingletonObject() {System.out.println(创建了单例对象);}//但是这样锁粒度还是太大进入到方法里边再加锁这样效率还低public static SingletonObject getInstance() {synchronized(SingletonObject.class) {//懒汉式如果没有再去创建if(obj null) {obj new SingletonObject();}}return obj;}
}懒汉式—线程不安全
我们能否在创建时再加锁呢于是有了如下的代码
public class SingletonObject {//懒汉式private static SingletonObject obj;//保证构造器私有外部不能实例化private SingletonObject() {System.out.println(创建了单例对象);}//线程不安全public static SingletonObject getInstance() {//懒汉式如果没有再去创建if(obj null) {synchronized(SingletonObject.class) {obj new SingletonObject();}}return obj;}
}这样的方式是线程不安全的比如
有两个线程线程1和线程2都进入到方法中判断到obj为null假如线程1先获取到锁为obj赋值完成然后方法运行结束返回obj然后线程2获取到锁又把obj赋值一次此时两次返回的就不是同一个对象了。
懒汉式—双重检查锁
下面的懒汉式设计模式用了双重检查锁
public class SingletonObject {//懒汉式,线程可见性private volatile static SingletonObject obj;//首先保证构造器私有外部不能实例化private SingletonObject() {System.out.println(创建了单例对象);}/*** 双重检查锁 内存可见性volatile*/public static SingletonObject getInstance() {//懒汉式如果没有再去创建if (obj null) {synchronized (SingletonObject.class) {if(obj null){obj new SingletonObject();}}}return obj;}
}方法getInstance()中如果单例对象为空才会把方法块加锁获取到锁的线程创建对象完成并赋值成功且obj保证了线程可见性其他线程便可以感知到obj不为null就不会再创建赋值了。