单例模式:将获取一个对象实例由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一个对象)
单例模式适用于频繁的创建和销毁对象