Skip to content

Commit 83c3f02

Browse files
feat
1 parent 2bb949d commit 83c3f02

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

JMM/src/singleton/lazyman/SingletonEnum.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package singleton.lazyman;
22

3+
import java.lang.reflect.Constructor;
4+
import java.lang.reflect.InvocationTargetException;
5+
36
/**
47
* 单例之八 -> 枚举(生产实践推荐使用)
58
* -> 单元素的枚举类型已经成为实现Singleton的最佳方法
@@ -12,7 +15,30 @@ public enum SingletonEnum {
1215

1316
INSTANCE;
1417

15-
public void whatever() {
18+
public SingletonEnum getInstance() {
19+
return INSTANCE;
20+
}
1621

22+
/**
23+
* 检查反射攻击
24+
*
25+
* @param args
26+
*/
27+
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
28+
SingletonEnum singleton1 = SingletonEnum.INSTANCE;
29+
SingletonEnum singleton2 = SingletonEnum.INSTANCE;
30+
System.out.println("正常情况下,实例化两个实例是否相同:" + (singleton1 == singleton2));
31+
Constructor<SingletonEnum> constructor;
32+
// 一旦一个类声明为枚举,实际上就是继承了 Enum,所以会有(String.class,int.class)的构造器
33+
constructor = SingletonEnum.class.getDeclaredConstructor(String.class, int.class); // 其父类的构造器
34+
constructor.setAccessible(true);
35+
SingletonEnum singleton3;
36+
singleton3 = constructor.newInstance("testInstance", 66);
37+
System.out.println(singleton1 + "\n" + singleton2 + "\n" + singleton3);
38+
/**
39+
* if ((clazz.getModifiers() & Modifier.ENUM) != 0)
40+
* throw new IllegalArgumentException("Cannot reflectively create enum objects");
41+
*/
42+
System.out.println("通过反射攻击单例模式情况下,实例化两个实例是否相同:" + (singleton1 == singleton3));
1743
}
1844
}

Thread/src/importantmethod/waitnotify/WaitNotifyReleaseOwnMonitor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public class WaitNotifyReleaseOwnMonitor {
1111
private static volatile Object resource2 = new Object();
1212

1313
public static void main(String[] args) {
14-
var thread1 = new Thread(() -> {
14+
Thread thread1 = new Thread(() -> {
1515
synchronized (resource1) {
1616
System.out.println("Thread1 got resource1 lock");
1717
synchronized (resource2) {

0 commit comments

Comments
 (0)