- 单例顾名思义,在jvm中有且只有一个对象. 确保一个类在任何情况下只有一个实例,并提供一个全局访问点.
- 单例的两种模式
- 饿汉式
- 懒汉式
public class Hungry {
/**
* 提前创建一个实例 且不能修改
*/
private static final Hungry HUNGRY = new Hungry();
/**
* 私有化构造方法
*/
private Hungry() {
}
/**
* 返回实例
*/
public static Hungry getInstance() {
return HUNGRY;
}
}
public class Lazy1 {
// 静态代码块
private static Lazy1 lazy1 = null;
private Lazy1() {
}
public static Lazy1 getInstance() {
if (lazy1 == null) {
// 先判断是否存在该实例 ,如果不存在则创建实例
lazy1 = new Lazy1();
}
// 实例存在则返回该实例
return lazy1;
}
}
private static void hungryTest() {
CountDownLatch latch = new CountDownLatch(count);
for (int i = 0; i < 10; i++) {
new Thread(() -> {
try {
latch.await();
Hungry instance = Hungry.getInstance();
System.out.println(System.currentTimeMillis() + " : " + instance);
} catch (Exception e) {
}
}).start();
latch.countDown();
}
}
- 执行结果
1591081577370 : com.huifer.design.singleton.Hungry@33b84c39
1591081577370 : com.huifer.design.singleton.Hungry@33b84c39
1591081577370 : com.huifer.design.singleton.Hungry@33b84c39
1591081577370 : com.huifer.design.singleton.Hungry@33b84c39
1591081577370 : com.huifer.design.singleton.Hungry@33b84c39
1591081577370 : com.huifer.design.singleton.Hungry@33b84c39
1591081577370 : com.huifer.design.singleton.Hungry@33b84c39
1591081577370 : com.huifer.design.singleton.Hungry@33b84c39
1591081577370 : com.huifer.design.singleton.Hungry@33b84c39
1591081577370 : com.huifer.design.singleton.Hungry@33b84c39
- hashCode 相同证明多线程环境下他也是单例的
private static void lazyTest1() {
CountDownLatch latch = new CountDownLatch(count);
for (int i = 0; i < 10; i++) {
new Thread(() -> {
try {
latch.await();
Lazy1 instance = Lazy1.getInstance();
System.out.println(System.currentTimeMillis() + " : " + instance);
} catch (Exception e) {
}
}).start();
latch.countDown();
}
}
- 执行结果
1591081604219 : com.huifer.design.singleton.Lazy1@22ec0514
1591081604219 : com.huifer.design.singleton.Lazy1@1a77cbc0
1591081604219 : com.huifer.design.singleton.Lazy1@22ec0514
1591081604219 : com.huifer.design.singleton.Lazy1@22ec0514
1591081604219 : com.huifer.design.singleton.Lazy1@645cd96c
1591081604219 : com.huifer.design.singleton.Lazy1@22ec0514
1591081604219 : com.huifer.design.singleton.Lazy1@22ec0514
1591081604219 : com.huifer.design.singleton.Lazy1@22ec0514
1591081604219 : com.huifer.design.singleton.Lazy1@22ec0514
1591081604219 : com.huifer.design.singleton.Lazy1@22ec0514
- hashCode 部分相同说明在多线程环境下没有单例,需要改进
最直接的改进
public class Lazy1 {
// 静态代码块
private static Lazy1 lazy1 = null;
private Lazy1() {
}
public synchronized static Lazy1 getInstance() {
if (lazy1 == null) {
// 先判断是否存在该实例 ,如果不存在则创建实例
lazy1 = new Lazy1();
}
// 实例存在则返回该实例
return lazy1;
}
}