饿汉式。加载时立即创建对象 饱汉式,调用才创建。如果对象体量大但不经常使用,不建议用单例模式,直接新建,清理线程会自动清理。 三种饱汉式的迭代思路: 用到就返回一个对象 用到先看看有没有被已存在的,没有再创建 解决线程安全与jvm指令重排的问题。先判断存不存在,存在直接返回;不存在加锁,再次判断空不空再创建。 直接创建可能指令重排,改变指令顺序,由指空间、初始化和赋值转为指空间、赋值和初始化。若执行的赋值那一步就不为空了,但属性没有初始化,调用不了属性的方法。所有需要再次判断是否为空,实例加上volatile表示不稳定的属性,用到的时候不能从本线程的缓存中查看,需要看主线程及其他线程中是否改变。 package com.ydj; public class Singleton { /*单例模式*/ private Singleton(){} //饿汉式。加载时立即创建对象private static Singleton instance = new Singleton(); private volatile static Singleton instance = null; //基本用法,用到时调用,返回一个对象。但重复创建对象,浪费资源。 /*public static Singleton getInstance(){ return instance; }*/ //饱汉式 /*public static Singleton getInstance(){ if (instance == null) { instance = new Singleton(); } return instance; }*/ //双重检查锁 public static Singleton getInstance(){ if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }