Skip to content

Commit ce7934d

Browse files
committed
update singleton design pattern
1 parent f58751a commit ce7934d

14 files changed

+165
-126
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package cn.delei.designpattern.singleton;
2+
3+
/**
4+
* 双重锁机制
5+
* <p>volatile结合synchronized关键字,线程安全</p>
6+
*
7+
* @author deleiguo
8+
*/
9+
public class DoubleCheckLockSingleton {
10+
11+
private volatile static DoubleCheckLockSingleton instance;
12+
13+
private DoubleCheckLockSingleton() {}
14+
15+
public static DoubleCheckLockSingleton getInstance() {
16+
// 检查是否要阻塞
17+
if (instance == null) {
18+
// 为类(对象)加锁
19+
synchronized (DoubleCheckLockSingleton.class) {
20+
// 检查是否要重新创建实例
21+
if (instance == null) {
22+
instance = new DoubleCheckLockSingleton();
23+
}
24+
}
25+
}
26+
return instance;
27+
}
28+
}
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,18 @@
66
*
77
* @author deleiguo
88
*/
9-
public class Singleton_7 {
9+
public class EnumSingleton {
1010

1111
static enum SingletonEnum {
1212
INSTANCE;
1313

14-
private Singleton_7 singleton;
14+
private EnumSingleton singleton;
1515

1616
private SingletonEnum() {
17-
singleton = new Singleton_7();
17+
singleton = new EnumSingleton();
1818
}
1919

20-
public Singleton_7 getInstnce() {
20+
public EnumSingleton getInstnce() {
2121
return singleton;
2222
}
2323
}
@@ -27,7 +27,7 @@ public Singleton_7 getInstnce() {
2727
*
2828
* @return Singleton_6 实例
2929
*/
30-
public static Singleton_7 getInstance() {
30+
public static EnumSingleton getInstance() {
3131
return SingletonEnum.INSTANCE.getInstnce();
3232
}
3333
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package cn.delei.designpattern.singleton;
2+
3+
/**
4+
* 使用枚举来实现单实例控制
5+
* 无偿地提供了序列化机制,并由JVM从根本上提供保障,绝对防止多次实例化
6+
*
7+
* @author deleiguo
8+
*/
9+
public enum EnumSingletonWithData {
10+
INSTANCE;
11+
12+
private Object data;
13+
14+
public Object getData() {
15+
return data;
16+
}
17+
18+
public void setData(Object data) {
19+
this.data = data;
20+
}
21+
22+
public static EnumSingletonWithData getInstance(){return INSTANCE;}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package cn.delei.designpattern.singleton;
2+
3+
/**
4+
* 饿汉式
5+
* <p>java classloader类加载时就初始化,线程安全,no lazy loading</p>
6+
*
7+
* @author deleiguo
8+
*/
9+
public class HungryNormalSingleton {
10+
private static HungryNormalSingleton instance = new HungryNormalSingleton();
11+
12+
public HungryNormalSingleton() {
13+
}
14+
15+
public static HungryNormalSingleton getInstance() {
16+
return instance;
17+
}
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package cn.delei.designpattern.singleton;
2+
3+
/**
4+
* 饿汉式
5+
* <p>java classloader类加载时就初始化,线程安全,no lazy loading</p>
6+
*
7+
* @author deleiguo
8+
*/
9+
public class HungryNormalStaticSingleton {
10+
private static final HungryNormalStaticSingleton instance;
11+
12+
static {
13+
instance = new HungryNormalStaticSingleton();
14+
}
15+
16+
public HungryNormalStaticSingleton() {}
17+
18+
public static HungryNormalStaticSingleton getInstance() {
19+
return instance;
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package cn.delei.designpattern.singleton;
2+
3+
/**
4+
* 懒汉式
5+
* <p>lazy loading 支持多线程,但是同步效率低</p>
6+
*
7+
* @author deleiguo
8+
*/
9+
public class LazyNormalSingleton {
10+
private static LazyNormalSingleton instance;
11+
12+
private LazyNormalSingleton() {
13+
14+
}
15+
16+
public static synchronized LazyNormalSingleton getInstance() {
17+
if (instance == null) {
18+
instance = new LazyNormalSingleton();
19+
}
20+
return instance;
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package cn.delei.designpattern.singleton;
2+
3+
/**
4+
* 基本实现方式
5+
* <p>不支持多线程 非线程安全 lazy loading</p>
6+
*
7+
* @author deleiguo
8+
*/
9+
public class LazyNormalUnSafeSingleton {
10+
// 静态块,公共内存区域
11+
private static LazyNormalUnSafeSingleton instance;
12+
13+
private LazyNormalUnSafeSingleton() {}
14+
15+
public static LazyNormalUnSafeSingleton getInstance() {
16+
if (instance == null) {
17+
instance = new LazyNormalUnSafeSingleton();
18+
}
19+
return instance;
20+
}
21+
}

source/java/interview/delei-interview-designpattern/src/main/java/cn/delei/designpattern/singleton/Singleton_1.java

Lines changed: 0 additions & 21 deletions
This file was deleted.

source/java/interview/delei-interview-designpattern/src/main/java/cn/delei/designpattern/singleton/Singleton_2.java

Lines changed: 0 additions & 22 deletions
This file was deleted.

source/java/interview/delei-interview-designpattern/src/main/java/cn/delei/designpattern/singleton/Singleton_3.java

Lines changed: 0 additions & 18 deletions
This file was deleted.

0 commit comments

Comments
 (0)