单例模式懒汉式和饿汉式区别

单例模式懒汉式和饿汉式区别

饿汉式`

public class SingletonEH {
    /**
     *是否 Lazy 初始化:否
     *是否多线程安全:是
     *实现难度:易
     *描述:这种方式比较常用,但容易产生垃圾对象。
     *优点:没有加锁,执行效率会提高。
     *缺点:类加载时就初始化,浪费内存。
     *它基于 classloder 机制避免了多线程的同步问题,
     * 不过,instance 在类装载时就实例化,虽然导致类装载的原因有很多种,
    * 在单例模式中大多数都是调用 getInstance 方法,
     * 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,
     * 这时候初始化 instance 显然没有达到 lazy loading 的效果。
     */
    private static SingletonEH instance = new SingletonEH();
    private SingletonEH (){}
    public static SingletonEH getInstance() {
        System.out.println("instance:"+instance);
        System.out.println("加载饿汉式....");
        return instance;
    }
}

懒汉式

public class SingletonLHsyn {
    /**
     *是否 Lazy 初始化:是
     *是否多线程安全:是
     *实现难度:易
     *描述:这种方式具备很好的 lazy loading,能够在多线程中很好的工作,但是,效率很低,99% 情况下不需要同步。
     *优点:第一次调用才初始化,避免内存浪费。
     *缺点:必须加锁 synchronized 才能保证单例,但加锁会影响效率。
     *getInstance() 的性能对应用程序不是很关键(该方法使用不太频繁)。
     */
    private static SingletonLHsyn instance;
    private SingletonLHsyn (){}
    public static synchronized SingletonLHsyn getInstance() {
        if (instance == null) {
            instance = new SingletonLHsyn();
        }
        return instance;
    }
懒汉式

public class SingletonLHsyn {
    /**
     *是否 Lazy 初始化:是
     *是否多线程安全:是
     *实现难度:易
     *描述:这种方式具备很好的 lazy loading,能够在多线程中很好的工作,但是,效率很低,99% 情况下不需要同步。
     *优点:第一次调用才初始化,避免内存浪费。
     *缺点:必须加锁 synchronized 才能保证单例,但加锁会影响效率。
     *getInstance() 的性能对应用程序不是很关键(该方法使用不太频繁)。
     */
    private static SingletonLHsyn instance;
    private SingletonLHsyn (){}
    public static synchronized SingletonLHsyn getInstance() {
        if (instance == null) {
            instance = new SingletonLHsyn();
        }
        return instance;
    }
}
懒汉式:
public class SingletonLHsyn {
/**
 *是否 Lazy 初始化:是
 *是否多线程安全:是
 *实现难度:易
 *描述:这种方式具备很好的 lazy loading,能够在多线程中很好的工作,但是,效率很低,99% 情况下不需要同步。
 *优点:第一次调用才初始化,避免内存浪费。
 *缺点:必须加锁 synchronized 才能保证单例,但加锁会影响效率。
 *getInstance() 的性能对应用程序不是很关键(该方法使用不太频繁)。
 */
private static SingletonLHsyn instance;
private SingletonLHsyn (){}
public static synchronized SingletonLHsyn getInstance() {
    if (instance == null) {
        instance = new SingletonLHsyn();
    }
    return instance;
}

关于懒汉式线程问题的解决方法:

class Single{
	
	//第一步:私有化构造函数
	private Single(){	}
		
	//创建锁对象
	private static Object lock = new Object();
	
	//第二步:创建本类自己对象,初始化为空
	public static Single instance =null;
	
	//对外提供一个公共方法,返回唯一对象
	public static Single getInstance(){
		
		<span style="color:#ff0000;">//加判断是提高后续线程的执行效率
		if(instance==null){
		//加同步的目的是保证对象的唯一
		synchronized (lock) {
		if (instance==null) {
			instance =new Single();
		}
		}
		}</span>
		//返回唯一的对象
		return instance;
	}
}
 
//创建线程任务类,测试多线程操作单例的懒汉式的安全问题
class Task implements Runnable{
	//复写run方法,书写线程任务
	public void run() {
	
		//获取单例对象,,输出其地址
		System.out.println(Single.getInstance());
	}
}
public class SingleThreadDemo {
 
	public static void main(String[] args) {
		
		//创建任务对象
		Task task= new Task();
		
		//创建线程对象,将任务对象作为参数传递
		Thread  t1= new Thread(task);
		Thread  t2= new Thread(task);
		
		//开启线程
		t1.start();
		t2.start();
		
		
	}
 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值