- public class Singleton {
- private static Singleton instance;
- private Singleton(){}
- public static synchronized Singleton getInstance(){
- if (instance == null){
- instance=new Singleton();
- }
- return instance;
- }
- }
第二种,通过双重检查锁的方式,减少了锁的范围来提升性能
- public class Singleton {
- private volatile static Singleton instance;
-
- private Singleton() {
- // 私有构造函数
- }
-
- public static Singleton getInstance() {
- if (instance == null) {
- synchronized (Singleton.class) {
- if (instance == null) {
- instance = new Singleton();
- }
- }
- }
- return instance;
- }
- }
instance
使用 volatile
关键字修饰,以确保多线程环境下的可见性和有序性。
使用
volatile
关键字修饰instance
变量,主要是为了保证在多线程环境下获取单例实例的可见性和有序性。具体来说:
可见性:当一个线程第一次访问
getInstance()
方法时,如果instance
为null
,那么该线程将进入同步块并创建实例。这个写操作对于其他线程来说是可见的,即它们将立即看到instance
的新值。这就避免了在一个线程创建实例后,其他线程仍然看到instance
为null
的情况。有序性:在双重检查锁中,由于编译器和处理器的优化行为,可能会发生指令重排序。如果没有使用
volatile
关键字修饰instance
,那么在某些情况下,其他线程可能会看到指令重排后的顺序,从而导致单例实例的未完全初始化。而使用volatile
修饰instance
后,禁止了这种指令重排序优化,保证了实例的完整性。
- public class Singleton {
- private static Singleton instance=new Singleton();
- private Singleton(){}
- public static Singleton getInstance(){
- return instance;
- }
-
- }
- public class Singleton {
- private static Singleton instance = null;
- static {
- instance=new Singleton();
- }
- private Singleton(){}
- public Singleton getInstance(){
- return instance;
- }
-
- }
- public class Singleton {
- private static class SingletonHolder{
- private static final Singleton INSTANCE=new Singleton();
- }
- private Singleton(){}
- public static final Singleton getInstance(){
- return SingletonHolder.INSTANCE;
- }
- }
- public enum Singleton {
- INSTANCE;
-
- // 添加其他成员变量和方法
-
- public void doSomething() {
- // 单例实例的操作
- }
- }