Java设计模式-单例

Java设计模式-单例

保证一个类仅有一个实例,并提供一个访问它的全局访问点。
单例模式(Singleton)的目的是为了保证在一个进程中,某个类有且仅有一个实例。

  1. 饿汉式
    在声明之初就指定对象实例化。
public class Singleton {
    // 静态字段引用唯一实例:
    private static final Singleton INSTANCE = new Singleton();

    // private构造方法保证外部无法实例化:
    private Singleton() {
    }
    // 通过静态方法返回实例:
    public static Singleton getInstance() {
        return INSTANCE;
    }
}

2.懒汉式
在真正调用的时候才实例化对象。

public class Singleton {
	private static Singleton INSTANCE = null;

	private Singleton() {
	}

	public static Singleton getInstance() {
		if (INSTANCE == null) {
			INSTANCE = new Singleton();
		}
		return INSTANCE;
	}
}

在单线程下这种懒汉式是没有问题的,但是在多线程下这种方式是线程不安全的,饿汉式会有JVM实例化替我们保证线程安全,懒汉式要进行以下改造。

public class Singleton {
	private static volatile Singleton INSTANCE = null;

	private Singleton() {
	}

	public static Singleton getInstance() {
		if (INSTANCE == null) {
			synchronized (Singleton.class) {
				if (INSTANCE == null) {
					INSTANCE = new Singleton();
				}
			}

		}
		return INSTANCE;
	}
}

为什么要这么做呢?
因为实例化表面上看起来是一个语句,但是里面涉及到了分配内存空间,初始化对象,将对象指向刚分配的内存空间的操作。有些编译器为了性能的原因,可能会将第二步和第三步进行重排序,那么使用volatile后重排序被禁止,所有的写(write)操作都将发生在读(read)操作之前。

3.内部类

public class Singleton {

    private Singleton() { 
    }

    private static class SingletonHolder {
        private static Singleton instance = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }
}

内部类这种形式支持懒加载,也线程安全,推荐使用
4.枚举
另一种实现Singleton的方式是利用Java的enum,因为Java保证枚举类的每个枚举都是单例,所以我们只需要编写一个只有一个枚举的类即可:

public enum Singleton {
     // 唯一枚举:
 	INSTANCE;
 
 	private String name = "singleton";
 
 	public String getName() {
 		return this.name;
 	}
 
 	public void setName(String name) {
 		this.name = name;
 	}
 }
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值