剑指offer-单例设计模式

懒汉模式与饿汉模式区别

饿汉模式是最简单的一种实现方式, 饿汉模式在类加载的时候就对实例
进行创建, 实例在整个程序周期都存在。 它的好处是只在类加载的时候创建
一次实例, 不会存在多个线程创建多个实例的情况, 避免了多线程同步的问
题。 它的缺点也很明显, 即使这个单例没有用到也会被创建, 而且在类加载
之后就被创建, 内存就被浪费了。

package com.msc.design;

class Singleton{
	private static final Singleton INSTANCE = new Singleton() ;
	private Singleton() {
		  System.out.printf("****** 【%s】实例化Singleton类对象 *******\n",Thread.currentThread().getName());
	} ;
	public static Singleton getInstance() {
		return INSTANCE ;
	}
	public void print() {
		System.out.println("单例设计模式饿汉式");
	}
}
class Singletonb{
	 private static Singletonb instance ;
	 private Singletonb() {
		  System.out.printf("****** 【%s】实例化Singleton类对象 *******\n",Thread.currentThread().getName());
	 } ;
	 public static Singletonb getInstance() {
		 if(instance == null) {
			 instance = new Singletonb() ;
		 }
		 return instance ;
	 }
	 public void print() {
		 System.out.println("单例设计模式懒汉式");
	 }   
}
class Singletonc{
	private static volatile Singletonc instance ;
	private Singletonc() {  
		System.out.printf("****** 【%s】实例化Singleton类对象 *******\n",Thread.currentThread().getName());
		} ;
		public static Singletonc getInstance() {
			if(instance == null) {
				synchronized (Singletonc.class) {
					if (instance == null) {
						 instance = new Singletonc() ;
					}
				}
			}
			return instance ;
		}
	public void print() {
		System.out.println("线程安全懒汉式");
	}
}
/**
 * 这个时候的确是进行了同步处理,但这个同步处理的代价有些大,因为效率会低。
 * 因为整体代码中实际上只有一块部分需要进行同步处理,instance对象的实例化处理部分。
 * @author msc
 * Singletond
 */
class Singletond{
	private static volatile Singletond instance ;
	private Singletond() {
		System.out.printf("****** 【%s】实例化Singleton类对象 *******\n",Thread.currentThread().getName());
	}
	public static synchronized Singletond getInstance() {
		if(instance == null) {
			instance = new Singletond() ;
		}
		return instance ;
	}
	public void print() {
		System.out.println("单例设计模式懒汉式");
	}
}
class Singletone {
	private static class SingletonHodler {
	private static Singletone ourInstance = new Singletone();
	}
	public static Singletone getInstance() {
		return SingletonHodler.ourInstance;
	}
	private Singletone() {
		System.out.printf("****** 【%s】实例化Singleton类对象 *******\n",Thread.currentThread().getName());
	};
	public void print() {
		System.out.println("线程安全的懒汉式:静态内部类");
	}
}
public class DesignPattern {

	public static void main(String[] args) throws InterruptedException {
		// TODO Auto-generated method stub
		  System.out.println("---------------非线程安全懒汉式-------------");
		   for (int i = 0; i < 3; i++) {
	            new Thread(()->{
	                Singletonb.getInstance().print();
	            },"单例消费端-"+i).start();
	        }
		   Thread.sleep(1000);
		   System.out.println("---------------线程安全懒汉式-------------");
		   for (int i = 0; i < 3; i++) {
	            new Thread(()->{
	                Singletond.getInstance().print();
	            },"单例消费端-"+i).start();
	        }
		 	Thread.sleep(1000);
		   System.out.println("---------------饿汉式-------------");
		   for (int i = 0; i < 3; i++) {
	            new Thread(()->{
	                Singleton.getInstance().print();
	            },"单例消费端-"+i).start();
	        }
	}
	

}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

隔壁de小刘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值