饿汉式
package com.kuang.singleton;
//饿汉式单例
public class Hungry {
// 饿汉式一上来就把这个类的所有东西和内存都加载了 相当于这个对象就已经存在了
//可能造成浪费空间
private byte[] date1 = new byte[1024*1024];
private byte[] date2 = new byte[1024*1024];
private byte[] date3 = new byte[1024*1024];
private byte[] date4 = new byte[1024*1024];
/* public static void main(String[] args) {
// TODO Auto-generated method stub
}*/
//无参构造方法
private Hungry(){
}
//new 出来一个对象 保证这个对象是唯一的了
private final static Hungry HUNGRY = new Hungry();
//给出一个对外的方法 用static 保证对外的可见性
public static Hungry getInstance(){
return HUNGRY;//饿汉式的意思就是一上来就把这个对象加载了
}
}
懒汉式(完整)
package com.kuang.singleton;
//懒汉式单例
public class LazyMan {
//把构造器私有
private LazyMan(){
System.out.println(Thread.currentThread().getName()+"ok");
}
//懒汉式一上来不加载对象,使用到这对象了在加载
private static volatile LazyMan lazyMan;
//加上volatile才是双重检测锁和原子性操作,这样就能保证下面的代码不是指令重排了
//static 可以写 写了是为了对外可见
//双重检查锁模式 懒汉式单例 DCL懒汉式
public static LazyMan getInstance(){
if(lazyMan == null){
synchronized(LazyMan.class){
if(lazyMan == null){
lazyMan = new LazyMan();//不是一个原子性操作
/** 底层:
* 1.分配内存空间
* 2.执行构造方法, 初始化对象
* 3.把这个对象指向这个空间
*
* 123
* 132 A
* (突然来了个线程B) B//此时lazyMan还没有完成构造
* 此时必须要加Volatile 来保证这个指令是不是重排的
*/
}
}
}
return lazyMan;//此时lazyMan还没有完成构造
}
//单线程下单例是ok的
//多线程并发下就不好用了 出现问题
public static void main(String[] args) {
for(int i=0 ; i<1000 ; i++){
new Thread(()->{
LazyMan.getInstance();
}).start();
}
}
}
静态内部类实现单例
枚举反编译class
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pXzS2nXn-1626768527538)(E:/md文件/图片/image-20210608232812923.png)]
这个代码也有空参的构造方法,也是不对的 ,因为我们发射的时候报了错误,提示没有这个方法
报错:Exception in thread “main” java.lang.NoSuchMethodException: com.kuang.singleton.EnumSingle.() 翻译:没有这样的方法异常
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rv55MgWq-1626768527539)(E:/md文件/图片/image-20210608234206310.png)]
测试结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OvwEQ3kW-1626768527540)(E:/md文件/图片/image-20210608235202144.png)]
没有这样的方法异常
[外链图片转存中…(img-Rv55MgWq-1626768527539)]
测试结果
[外链图片转存中…(img-OvwEQ3kW-1626768527540)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aGOMJ873-1626768527541)(E:/md文件/图片/image-20210609000349954.png)]