public class Hungry {
private Hungry(){}
private final static Hungry HUNGRY = new Hungry();
public static Hungry getHUNGRY() {
return HUNGRY;
}
}
public class LazyMan {
private static boolean asasasas= false;
private LazyMan() {
synchronized (LazyMan.class){
if(asasasas ==false){
asasasas = true;
}else {
throw new RuntimeException("不要试图破坏我的单利模式!");
}
}
}
private volatile static LazyMan lazyMan;
private static LazyMan getInstance() {
if (lazyMan == null) {
synchronized (LazyMan.class) {
if (lazyMan == null) {
lazyMan = new LazyMan();
// java创建一个对象
//1、分配内存空间
//2、执行狗仔方法、创建对象
//3、将对象指向空间
//A 先执行13,这个时候对象还没有初始化!
//B 发现对象为空,B线程拿到的对象不是完成的
}
}
}
return lazyMan;
}
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
// LazyMan instance = LazyMan.getInstance();
Constructor<LazyMan> constructor = LazyMan.class.getDeclaredConstructor(null);
constructor.setAccessible(true);
LazyMan lazyMan = constructor.newInstance();
Field asasasas = LazyMan.class.getDeclaredField("asasasas");
asasasas.setAccessible(true);
asasasas.set(lazyMan,false);
LazyMan lazyMan1 = constructor.newInstance();
System.out.println(lazyMan1);
System.out.println(lazyMan);
}
}
public enum SingleEnum {
INSTANCE;
public SingleEnum getInstance(){
return INSTANCE;
}
}
class Demo{
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Constructor<SingleEnum> declaredConstructor = SingleEnum.class.getDeclaredConstructor(String.class, int.class);
declaredConstructor.setAccessible(true);
SingleEnum singleEnum = declaredConstructor.newInstance();
SingleEnum singleEnum1 = declaredConstructor.newInstance();
System.out.println(singleEnum.hashCode());
System.out.println(singleEnum1.hashCode());
// 这里没有构造函数! JVM 才是正确
}
}
JAVA单例模式讲解
最新推荐文章于 2022-11-12 14:29:21 发布