多线程懒汉模式

package 设计模式.创建型.单例模式.简单单例模式饿汉;
/**
 * @Title:简单单例模式 
 *  一般用在log日志上使用(相当于是高级版的静态常量。带懒初始化功能。)  
 *  只需要使用一个单独的资源,并且需要共享这个单独资源的状态信息时,就能用到单例模式。
 * @author: gun
 *2018-1-12上午10:46:23
 */
public class Singleton {
    private final static Singleton INSTANCE = new Singleton();
  
    // Private constructor suppresses   
    private Singleton() {}
 
    // default public constructor
    public static Singleton getInstance() {
        return INSTANCE;
    }
    
    public static void main(String[] args) {
    	for (int i = 0; i < 100; i++) {
        	System.out.println(INSTANCE);	
		}
    	
    }
  }
package 设计模式.创建型.单例模式.多线程懒汉模式2;
/**
 * @Title:多线程懒汉模式   //不推荐,因为在多线程下很容易引起并发问题
 * @author: gun
 *2018-1-12上午10:53:55
 */
public class Singleton {

    // Private constructor suppresses   
    private Singleton() {
    }

    private static class LazyHolder {
        static final Singleton INSTANCE = new Singleton();//这里和饿汉的区别就是 这里是需要调用的时候才会创建   
    }

    public static Singleton getInstance() {
        return LazyHolder.INSTANCE;
    }
}
package 设计模式.创建型.单例模式.多线程懒汉模式推荐;
/**
 * @Title: 多线程的懒汉模式 (维基百科推荐)
 * 在Java编程语言中,单例模式(懒汉模式)应用的例子如下述代码所示 
 * (此种方法只能用在JDK5及以后版本(注意 INSTANCE 被声明为 volatile),之前的版本使用“双重检查锁”会发生非预期行为[1]):
 * @author: gun
 *2018-1-12上午10:52:24
 */
public class Singleton {
    private static volatile Singleton INSTANCE = null;
  

    private Singleton() {}
  
    //线程安全和性能提升
    public static  Singleton getInstance() {
        if(INSTANCE == null){
             synchronized(Singleton.class){
                 //当两个以上的线程同时运行到第一个null检查时,为了避免再次出现超过一次的情况,需要再次检查它。
                 if(INSTANCE == null){ 
                     INSTANCE = new Singleton();
                  }
              } 
        }
        return INSTANCE;
    }
  }

转载于:https://my.oschina.net/u/3254021/blog/1863362

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值