科技公司网站网页,wordpress系统优化,做一个公司网站要多少钱,网站布局设计排版首先#xff0c;单例模式分为饿汉模式和懒汉模式 单例模式有什么用呢? 可以保证在程序运行过程中#xff0c;一个类只有一个实例#xff0c;而且该实例易于供外界访问#xff0c;从而方便的控制了实例个数#xff0c;并节约系统资源。 例如#xff1a;DataSource#x…首先单例模式分为饿汉模式和懒汉模式 单例模式有什么用呢? 可以保证在程序运行过程中一个类只有一个实例而且该实例易于供外界访问从而方便的控制了实例个数并节约系统资源。 例如DataSourceJDBC中)类对象只需要一个。 饿汉模式:知道你很饿所以提前给你准备好了于是在类加载的过程中创建实例所以就写在static代码块中和类一起加载。
static class Singleton {private static Singleton singleton new Singleton();private Singleton() {}public static Singleton getSingleton() {return singleton;}}
懒汉模式:知道你很饿但是当你第一次需要的时候我再给你不需要的时候是没有我的实例对象给你调用的这个实例对象通常由方法中创建由方法来返回。
class Singleton {private static Singleton singleton null;private Singleton() {}public static Singleton getSingleton() {if (singleton null) {singleton new Singleton();}return singleton;}
}
其中很关键的一步是private Singleton() {}这一句代码让其他类没法调用它的构造方法。 因为饿汉模式提前创建好了所以天生就是线程安全的。
而懒汉模式是需要才创建那么多个线程中同时需要会怎么办会不会出现线程安全问题?
会的,如果多个线程中同时调用getSingleton方法那么就有可能同时创建出多个实例对象。
那么怎么解决这个线程安全问题呢?
使用synchronized关键字
public synchronized static Singleton getSingleton() {if (singleton null) {singleton new Singleton();}return singleton;}
能不能再改进一下?
为了解决线程安全性的可见性问题,使用volatile关键字
另外,再使用双重if语句判断,降低锁竞争的频率
private static volatile Singleton singleton null;public static Singleton getSingleton() {if (singleton null) {synchronized (Singleton.class) {if (singleton null) {singleton new Singleton();}}}return singleton;}