91名师指路-头部
91名师指路

单例模式的五种写法

由于某些原因,现在不支持支付宝支付,如需要购买源码请加博主微信进行购买,微信号:13248254750

一:懒汉模式(线程不安全)

原理:延迟创建,在第一次用时才创建,之后每次用到就返回创建好的。
缺点:由于synchronized的存在,多线程时效率很低。

代码如下:
package com.mszl.model;


/**
* 功能:懒汉模式(线程不安全)
* 更多资料请访问:http://www.91mszl.com
* @author bobo teacher
*/
public class SingletonDemo1 {

private static SingletonDemo1 instance;

private SingletonDemo1(){

}

public static SingletonDemo1 getInstance() {
if(null==instance){
System.out.println("欢迎来到91名师指路:http://www.91mszl.com");
instance=new SingletonDemo1();
}
return instance;
}



}


要解决懒汉模式线程不安全的问题,只需要加上synchronized 关键字就可以了。代码如下:

package com.mszl.model;

/**
* 功能:懒汉模式(线程安全)
* 更多资料请访问:http://www.91mszl.com
* @author bobo teacher
*/
public class SingletonDemo2 {

private static SingletonDemo2 instance;

private SingletonDemo2(){

}

public static synchronized SingletonDemo2 getInstance() {
if(null==instance){
System.out.println("欢迎来到91名师指路:http://www.91mszl.com");
instance=new SingletonDemo2();
}
return instance;
}



}


二:饿汉模式(线程安全)

原理:创建好一个静态变量,每次要用时直接返回。
缺点:无法做到延迟创建对象,在类加载时进行创建会导致初始化时间变长。

代码如下:

package com.mszl.model;


/**
* 功能:饿汉模式(线程安全)
* 更多资料请访问:http://www.91mszl.com
* @author bobo teacher
*/
public class SingletonDemo3 {

private static SingletonDemo3 instance=new SingletonDemo3();

private SingletonDemo3(){

}

public static SingletonDemo3 getInstance() {
System.out.println("欢迎来到91名师指路:http://www.91mszl.com");
return instance;
}



}


三:静态类内部加载(线程安全)

原理:通过一个静态内部类定义一个静态变量来持有当前类实例,在类加载时就创建好,在使用时获取。
缺点:无法做到延迟创建对象,在类加载时进行创建会导致初始化时间变长。

代码如下:

package com.mszl.model;

/**
* 功能:静态类内部加载(线程安全)
* 更多资料请访问:http://www.91mszl.com
* @author bobo teacher
*/
public class SingletonDemo4 {

private static class singleLoad{
private static SingletonDemo4 instance=new SingletonDemo4();
}

private SingletonDemo4(){

}

public static SingletonDemo4 getInstance(){
System.out.println("欢迎来到91名师指路:http://www.91mszl.com");
return singleLoad.instance;
}



}


四:枚举方法(线程安全)

代码如下:

package com.mszl.model;

/**
* 功能:枚举方法(线程安全)
* 更多资料请访问:http://www.91mszl.com
* @author bobo teacher
*/
public enum SingletonDemo5 {

INSTANCE;
public void instance(){
System.out.println("欢迎来到91名师指路:http://www.91mszl.com");
}


public static void main(String[] args) {
INSTANCE.instance();
}


}


五:volatile双端检锁(DCL double check lock)

原理:在getSingleton()方法中,进行两次null检查。这样可以极大提升并发度,进而提升性能。

代码如下:

package com.mszl.model;

/**
* 功能:volatile
* 更多资料请访问:http://www.91mszl.com
* @author bobo teacher
*/
public class SingletonDemo7 {

private static volatile SingletonDemo7 instance;

private SingletonDemo7(){

}

public static SingletonDemo7 getInstance() {
if(null==instance){
synchronized (SingletonDemo7.class) {
if(null==instance){
instance=new SingletonDemo7();
}
}
}
return instance;
}


}


2019-11-20 17:24:16     阅读(693)

名师出品,必属精品    https://www.91mszl.com

联系博主    
用户登录遮罩层
x

账号登录

91名师指路-底部