原 单例模式的五种写法
版权声明:本文为博主原创文章,请尊重他人的劳动成果,转载请附上原文出处链接和本声明。
本文链接:https://www.91mszl.com/zhangwuji/article/details/1121
原理:延迟创建,在第一次用时才创建,之后每次用到就返回创建好的。
缺点:由于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();
}
}
代码如下:
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 阅读(809)
名师出品,必属精品 https://www.91mszl.com
博主信息