java-单例模式

单例模式:将获取一个对象实例由new变成类名.getinstance()的形式。
饿汉式:
缺点:在类装载的时候就完成了实例化,未达到懒加载的模式。(如果没有用就浪费了)

第一种写法:

public class designmodel {
public static void main(String[] args)
{
	//静态饿汉式
	Singleton instanceSingleton=Singleton.getinstance();
}
}
class Singleton{
	private Singleton()
	{
		
	}
	private final static Singleton INSTANCE=new Singleton();
	public static   Singleton getinstance()
	{
		return INSTANCE;
	}
	
}

第二种写法:

class Singleton{
	private Singleton()
	{
		
	}
	private final static Singleton INSTANCE;
	static
	{
		INSTANCE=new Singleton();
	}
	public static   Singleton getinstance()
	{
		return INSTANCE;
	}
	
}

懒汉式:(存在线程安全问题,加了同步后效率变低)

第一种写法:线程并发时不安全

public class lanhan {
singleton  instanceSingleton=singleton.getinstance();
}
class singleton{
	private static singleton instanceSingleton;
	private singleton() {};
	public static singleton getinstance()
	{
	if(instanceSingleton==null)
		instanceSingleton=new singleton();
	return instanceSingleton;
	}
	
}

第二种方法:函数上+了synchronized

public class lanhan {
singleton  instanceSingleton=singleton.getinstance();
}
class singleton{
	private static singleton instanceSingleton;
	private singleton() {};
	public static synchronized singleton getinstance()
	{
	
	if(instanceSingleton==null)
	{
	instanceSingleton=new singleton();
	}
	
	return instanceSingleton;
	}
	
}

双重检查法

public class lanhan {
singleton  instanceSingleton=singleton.getinstance();
}
class singleton{
	private static volatile singleton instanceSingleton;
	private singleton() {};
	public static singleton getinstance()
	{
	
	if(instanceSingleton==null)
	{//当两个线程同时进入时,一个会先获得锁,释放后,另一个再获得
	synchronized(Singleton.class)
	{  if(instanceSingleton==null)//这样子,后得到那个锁的线程还是没法新创建实例,只能返回之前的实例。
	{
	     instanceSingleton=new singleton();
	}
	}
	}
	
	return instanceSingleton;
	}
	
}

静态内部类方法
当singleton类被装载时,静态内部类不会被装载。当我们用到getInstance()方法时,用到了静态变量时,静态内部类会被装载。只会装载一次,并且是线程安全的。

public class 静态内部类 {
	public static void main(String[] args) {
		Singleton instanceSingleton=Singleton.getInstance();
	}
}

class Singleton{
	//构造器私有化
	private Singleton(){}
	//写一个内部静态类,该类中有一个静态属性Singleton
	private static class SingleInstance{
		private static final Singleton INSTANCE=new Singleton();
	}
	//提供一个静态私有方法
	public static synchronized Singleton getInstance()
	{
		return SingleInstance.INSTANCE;
	}
	
}

枚举法

public class 枚举 {
public static void main(String[] args)
{//避免多线程的方式,而且还能防止反序列化重新创建新的对象。
	Singleton instanceSingleton=Singleton.INstance;
}
}
enum Singleton{
INstance;
}

Runtime类就是单例模式的饿汉式(通过直接new一个对象)

单例模式适用于频繁的创建和销毁对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值