实战,让学习更简单     全国咨询热线:400-009-1906

北京 切换校区

全国24小时免费热线

400-009-1906

java中的6种单例写法

时间:2018-11-29   来源:尚学堂   阅读:99
首页> java中的6种单例写法

        在java中,单例有很多种写法,面试时,手写代码环节,除了写算法题,有时候也会让手写单例模式,这里记录一下单例的几种写法和优缺点。
        1.初级写法
        2.加锁
        3.饿汉式
        4.懒汉式
        5.双锁检验
        6.内部类

 

        1.初级写法

package com.java4all.test6;

/**
* Author: yunqing
* Date: 2018/8/13
* Description:单例模式 -- 初级
*/
public class Singleton {

private static Singleton singleton = null;

public Singleton() {
}

/**并发下会产生多个实例*/
public static Singleton getInstance(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}

        上面这种写法,在并发环境下,会出现多个实例。

 

        2.加锁
        我们优化上面的代码,遇到并发,很容易想到加锁,把获取对象的方法加上关键字synchronized,很巧,这种写法也称为懒汉式单例 ,如下:

package com.java4all.test6;

/**
* Author: yunqing
* Date: 2018/8/13
* Description:
*/
public class BadSynchronizedSingleton {
private static BadSynchronizedSingleton synchronizedSingleton;

private BadSynchronizedSingleton() {
}

/**
* 缺点:等待时间长
* 这种整个方法都同步了,效率很低
* */
public synchronized static BadSynchronizedSingleton getInstance(){
if(synchronizedSingleton == null){
synchronizedSingleton = new BadSynchronizedSingleton();
}
return synchronizedSingleton;
}
}

        但是,显然,我们把整个方法都同步了,效率很低下,我们可以继续优化,只在创建实例的地方加上同步,参考5双锁检验。

 

        3.饿汉式
        饿汉式的特点是:类在加载时就直接初始化了实例。即使没用到,也会实例化。

package com.java4all.test6;

/**
* Author: yunqing
* Date: 2018/8/13
* Description:饿汉式单例模式--类初始化时就自行实例化
*/
public class ESingleton {

/**类在加载的时候直接进行初始化*/
private static final ESingleton ESINGLETON = new ESingleton();

private ESingleton() {}

/**对外暴露唯一接口 提供单例对象*/
public static ESingleton geteSingleton(){
return ESINGLETON;
}
}

 

        4.懒汉式
        懒汉式的特点是:用到这个实例时才去调用方法实例化。这个和2中的看起来是一样的,因为这个实例化方法加了synchronized ,这样安全一些。

package com.java4all.test6;

/**
* Author: yunqing
* Date: 2018/8/13
* Description:懒汉式单例模式
* 第一次调用时实例化
*/
public class BSingleton {

private static BSingleton bSingleton ;

private BSingleton() {
}

/**
* 整个方法锁住了,效率较低
* @return
*/
public synchronized static BSingleton getbSingleton(){
if(bSingleton == null){
bSingleton = new BSingleton();
}
return bSingleton;
}
}

 

        5.双锁检验
        双重非空判断,new对象前加一次锁。

        volatile关键字,考虑的是,new关键字在虚拟机中执行时其实分为很多步骤,具体原因可以参考深入理解java虚拟机一书(考虑的是这个new关键字字节码执行时是非原子性的),而volatile关键字可以防止指令重排。

package com.java4all.test6;

/**
* Author: yunqing
* Date: 2018/8/13
* Description:双锁检验
*/
public class SynchronizedSingleton {

/**volatile防止指令重排*/
private static volatile SynchronizedSingleton singleton;

private SynchronizedSingleton() {
}

/**只是在实例为空时才进行同步创建
* 为什么做了2次判断?
* A线程和B线程同时进入同步方法0
* 然后都在1位置处判断了实例为null
* 然后都进入了同步块2中
* 然后A线程优先进入了同步代码块2中(B线程也进入了),然后创建了实例
* 此时,如果没有3处的判断,那么A线程创建实例同时,B线程也会创建一个实例
* 所以,还需要做2次判断
* */
public static SynchronizedSingleton getInstance(){//0
if(singleton == null){//1
synchronized (SynchronizedSingleton.class){//2
if(singleton == null){//3
singleton = new SynchronizedSingleton();//4
}
}
}
return singleton;
}
}

 

        6.内部类

package com.java4all.test6;

/**
* Author: yunqing
* Date: 2018/9/15
* Description:静态内部类
* 优点:1.延迟,外部类初始化时不会进行实例创建,要用时才会创建
* 2.安全,静态成员变量
*/
public class FSingleton {

private FSingleton() {
}

public static FSingleton getInstance(){
return Singleton.fSingleton;
}

private static class Singleton{
private static FSingleton fSingleton = new FSingleton();
}
}

相关资讯

  • 北京校区
  • 山西校区
  • 郑州校区
  • 武汉校区
  • 四川校区
  • 长沙校区
  • 深圳校区
  • 上海校区
  • 广州校区
  • 保定招生办

北京海淀区校区(总部):北京市海淀区西三旗街道建材城西路中腾建华商务大厦东侧二层尚学堂
北京京南校区:北京亦庄经济开发区科创十四街6号院1号楼 赛蒂国际工业园
咨询电话:400-009-1906 / 010-56233821
面授课程: JavaEE培训大数据就业班培训大数据云计算周末班培训零基础大数据连读班培训大数据云计算高手班培训人工智能周末班培训人工智能+Python全栈培训H5+PHP全栈工程师培训

山西学区地址:山西省晋中市榆次区大学城大学生活广场万科商业A1座702
咨询电话:0354-3052381 / 18903441162

郑州学区地址:金水区东风路经三路北100米注协大厦10楼
咨询电话:0371-55177956 

武汉学区地址:湖北省武汉市江夏区江夏大道26号 宏信悦谷创业园4楼
咨询电话:027-87989193

四川学区地址:成都市高新区锦晖西一街99号布鲁明顿大厦2栋1003室
咨询电话:028-65176856 / 13880900114

长沙学区地址:长沙市岳麓区麓源路湖南电子商务基地5楼(公交车站:六沟垅)
咨询电话:0731-83072091

深圳校区地址:深圳市宝安区航城街道航城大道航城创新创业园A4栋210(固戍地铁站C出口)
咨询电话:0755-23061965 / 18898413781

上海尚学堂松江校区地址:上海市松江区荣乐东路2369弄45号绿地伯顿大厦2层
咨询电话:021-67690939

广州校区地址:广州市天河区元岗横路31号慧通产业广场B区B1栋6楼尚学堂(地铁3号线或6号线到“天河客运站”D出口,右拐直走约800米)
咨询电话:020-2989 6995

保定招生办公室

地址:河北省保定市竞秀区朝阳南大街777号鸿悦国际1101室

电话:15132423123

Copyright 2006-2018 北京尚学堂科技有限公司  京ICP备13018289号-19  京公网安备11010802015183  
媒体联系:18610174079 闫老师  

有位老师想和您聊一聊