一、饿汉模式
package com.xu.demo.singleton;
/**
* 饿汉式单例
*/
public class HungrySingleton {
public final static HungrySingleton hungry = new HungrySingleton();
/**
* 很明显,一进来就加载对象,存在浪费空间
* 这时候我们需要一个用的时候才加载对象,不用不加载
* 这个时候可以使用懒汉式单例
*/
private HungrySingleton() {
}
public static HungrySingleton getInstance() {
return hungry;
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + ":"
+ LazzySingleton.getInstance().hashCode());
;
}).start();
}
}
}
运行结果如下:
二、懒汉模式
package com.xu.demo.singleton;
public class LazzySingleton {
/**
* 这种方式,单线程是OK的,多线程就不行了
*/
private LazzySingleton() {
}
public static LazzySingleton lazzySingleton;
public static LazzySingleton getInstance() {
if (lazzySingleton == null) {
lazzySingleton = new LazzySingleton();
}
return lazzySingleton;
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + ":"
+ LazzySingleton.getInstance().hashCode());
}).start();
}
}
}
运行结果:
三、双锁模式
package com.xu.demo.singleton;
public class DoubleLockSingleton {
/**
* 这种方式,单线程是OK的,多线程就不行了
*/
private DoubleLockSingleton() {
}
public static volatile DoubleLockSingleton doubleLockSingleton;
public static DoubleLockSingleton getInstance() {
if (doubleLockSingleton == null) {
synchronized (DoubleLockSingleton.class) {
if (doubleLockSingleton == null) {
doubleLockSingleton = new DoubleLockSingleton();
}
}
}
return doubleLockSingleton;
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + ":"
+ LazzySingleton.getInstance().hashCode());
}).start();
}
}
}
运行结果: