JUC并发编程——单例模式(基于狂神说的学习笔记)

编程入门 行业动态 更新时间:2024-10-10 05:26:11

JUC并发编程——单例模式(基于狂神说的<a href=https://www.elefans.com/category/jswz/34/1770117.html style=学习笔记)"/>

JUC并发编程——单例模式(基于狂神说的学习笔记)

单例模式

饿汉式:

package single;// 饿汉式单例
public class hungry {// 饿汉式有可能会浪费内存// 因为饿汉式在生成对象时,就创建了所有的空间// 单例模式构造器私有private hungry(){}private final static hungry HUNGRY = new hungry();public static hungry getInstance(){return HUNGRY;}
}

普通懒汉式:

package single;// 懒汉式单例模式
public class lazy {// 单例模式构造器私有private lazy(){System.out.println(Thread.currentThread().getName()+" gotten");}// 普通懒汉式,在并发下可能会出现问题private static lazy lazyMan;public static lazy getInstance(){if (lazyMan == null){lazyMan = new lazy();}return lazyMan;}public static void main(String[] args) {for (int i = 0; i < 10; i++) {new Thread(()->{lazy.getInstance();}).start();}}}

使用synchronized与volatile的懒汉式单例

package single;// 懒汉式单例模式
public class lazy {// 单例模式构造器私有private lazy(){System.out.println(Thread.currentThread().getName()+" gotten");}// 双重检测锁模式的懒汉式单例private volatile static lazy lazyMan;private static lazy getInstance(){if(lazyMan == null){synchronized(lazy.class){if (lazyMan == null){lazyMan = new lazy();// 不是一个原子性操作/*** 1、分配内存空间* 2、执行构造方法,初始化对象* 3、把这个对象指向这个空间* 该过程可能发生指令重排* 因此必须让对象加volatile生成内存屏障*/}}}return lazyMan;}public static void main(String[] args) {for (int i = 0; i < 10; i++) {new Thread(()->{lazy.getInstance();}).start();}}}

静态内部类

package single;// 静态内部类  (不安全)
public class Holder {// 单例模式构造器私有private Holder(){}public static Holder getInstance(){return InnerClass.HOLDER;}public static class InnerClass{private static final Holder HOLDER = new Holder();}
}

以上单例都不安全,使用反射即可破坏单例

使用枚举单例模式,反射无法破坏枚举单例

更多推荐

JUC并发编程——单例模式(基于狂神说的学习笔记)

本文发布于:2023-12-07 08:59:28,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1670759.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:学习笔记   模式   JUC   狂神说

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!