饿汉式(强烈推荐)
小编从事在线教育多年,将自己的资料整合建了一个QQ群,对于有兴趣一起交流学习java的可以加群:732976516,里面有大神会给予解答,也会有许多的资源可以供大家学习分享,欢迎大家前来一起学习进步!
优势:初试化静态的instance创建一次。假如人们在Singleton类里头写1个静态的方式不用构建例子,它依然会早早的建立一次典例。而减少运存的利用率。
缺陷:找不到lazy loading的效果,进而减少运存的利用率。
单线程下
注解: Singleton的静态属性instance中,只是instance为null的那时候才建立1个案例,构造函数私有,保证每一次都只建立一个,防止多次重复建立。
缺点:4只在单线程的具体情况下正常运作,在多线程的状况下,就会出问题。比如:当2个线程一起运转到判定instance是不是为空的if语句,而且instance的确没有建立好时,那么两个线程都是建立1个实例。
懒汉式
注解:在单线程的基础上再加了同步锁,促使在多线程的状况下还可以用。比如:当2个线程一起想建立案例,因为在1个时刻只能1个线程能获得同步锁,当第一位线程添加锁之后,第二个线程只有等候。第一位线程遇到案例都没有建立,创建之。第一位线程施放同步锁,第二个线程才可以再加同步锁,实行下面的代码。因为第一个线程已经建立了典例,因此下一个线程不用建立案例。确保在多线程的环境下也只能一个实例。
缺陷:每一次按照getInstance方法得到singleton实例的时候都有一个试图去获取同步锁的过程。而显而易见,加锁是很用时的。能防止则防止。
double check
注解:只有当instance为null时,需要获取同步锁,建立一次案例。当实例被创建,则不用尝试加锁。
缺陷: 可能会出现空指针异常,一个线程获取了同步锁,并且创建了,可是都还没完成初始化。 另外一个线程直接 getInstace ,因此这个线程可能获取到的对象,很多地方没有初始化完成,引起援引的空指针现象。
double check and add volatile (推荐)
优势:在 instance 上添加了 volatile ,促使每一次执行读操作的那时候确保写操作早已完成.
静态内部类 (推荐)
枚举enum
运用enum只初始化一次的特性,确保了线程安全性.
小编分类整理了许多java进阶学习材料和BAT面试题,需要资料的请转发此文章后再私聊小编回复【java】就能领取2019年java架构师进阶学习资料和BAT面试题。
网友评论