单例模式
单例的目的是保证某个类仅有一个实例。当有某些类创建对象内存开销较大时可以考虑使用该模式。单例模式又分为 饿汉式 和 懒汉式。
1.饿汉式
饿汉式。顾名思义,该模式在类被加载时就会实例化一个对象。
该模式能简单快速的创建一个单例对象,而且是线程安全的(只在类加载时才会初始化,以后都不会)。但它有一个缺点,就是不管你要不要都会直接创建一个对象,会消耗一定的性能
//饿汉式
public class Hungry {
private Hungry(){}
private final static Hungry HUNGRY = new Hungry();
public static Hungry getInstance(){
return HUNGRY;
}
}
2.懒汉式
2.懒汉式。该模式只在你需要对象时才会生成单例对象(比如调用getInstance方法)但他不是线程安全的
//懒汉式
public class LazyMan {
private LazyMan() {
System.out.println(Thread.currentThread().getName() + "--ok");
}
//volatile保证并发内存可见性,有序性,可以防止指令重排,但不能保证原子性
private volatile static LazyMan lazyMan;
public static LazyMan getInstance() {
//双重检测锁模式 懒汉式单例 简称DCL
if (lazyMan == null) {
//synchronized保证并发内存可见性,有序性,原子性
synchronized (LazyMan.class){
//不是原子性操作,可能会造成指令重排
lazyMan = new LazyMan();
}
}
return lazyMan;
}
//单线程ok,多线程不行,需要加锁
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(LazyMan::getInstance).start();
}
}
}
标签:JAVA,Hungry,public,---,懒汉,static,单例,LazyMan
From: https://www.cnblogs.com/wang1999an/p/16916437.html