//饿汉式(静态变量)
public class SingletonTest01 {
public static void main(String[] args) {
//测试
SingleTon instance1 = SingleTon.getInstance();
SingleTon instance2 = SingleTon.getInstance();
//其实拿到的是同一个实例对象
System.out.println(instance1==instance2);
//比较哈希码
System.out.println("instance1.hashCode()="+instance1.hashCode());
System.out.println("instance2.hashCode()="+instance2.hashCode());
}
}
class SingleTon {
//1.构造器私有化
private SingleTon() {
}
//2.在本类内部创建对象实例
private final static SingleTon instance = new SingleTon();
//3.对外提供一个公有的静态方法,返回实例对象
public static SingleTon getInstance() {
return instance;
}
}
与静态变量的写法类似,只不过在静态代码块中创建了新的单例对象
//饿汉式(静态代码块)
public class SingletonTest02 {
public static void main(String[] args) {
//测试
SingleTon instance1 = SingleTon.getInstance();
SingleTon instance2 = SingleTon.getInstance();
//其实拿到的是同一个实例对象
System.out.println(instance1==instance2);
//比较哈希码
System.out.println("instance1.hashCode()="+instance1.hashCode());
System.out.println("instance2.hashCode()="+instance2.hashCode());
}
}
class SingleTon {
//1.构造器私有化
private SingleTon() {}
//2.在本类内部创建对象实例
private static SingleTon instance;
static {
//在静态代码块中创建单例对象
instance = new SingleTon();
}
//3.对外提供一个公有的静态方法,返回实例对象
public static SingleTon getInstance() {
return instance;
}
}
public class SingletonTest03 {
public static void main(String[] args) {
System.out.println("懒汉式,线程不安全");
//测试
SingleTon instance1 = SingleTon.getInstance();
SingleTon instance2 = SingleTon.getInstance();
//其实拿到的是同一个实例对象
System.out.println(instance1==instance2);
//比较哈希码
System.out.println("instance1.hashCode()="+instance1.hashCode());
System.out.println("instance2.hashCode()="+instance2.hashCode());
}
}
class SingleTon {
private SingleTon () {} //构造私有化
private static SingleTon instance; //内部创建对象
//提供一个静态的公有方法,当使用到该方法的时候才创建intance
//即懒汉式
public static SingleTon getInstance() {
if(instance==null) { //就是在这里加了一个判断,但是如果最开始两个或多个线程同时进入到这里,实例还没创建好,可能判断结果都为真,就会创建多个实例
instance = new SingleTon();
}
return instance;
}
}
public class SingletonTest04 {
public static void main(String[] args) {
System.out.println("懒汉式(2),线程安全");
//测试
SingleTon instance1 = SingleTon.getInstance();
SingleTon instance2 = SingleTon.getInstance();
//其实拿到的是同一个实例对象
System.out.println(instance1==instance2);
//比较哈希码
System.out.println("instance1.hashCode()="+instance1.hashCode());
System.out.println("instance2.hashCode()="+instance2.hashCode());
}
}
class SingleTon {
private static SingleTon instance;
private SingleTon () {}
//提供一个静态的公有方法 加入了同步处理的代码,解决的了线程安全问题
//即懒汉狮
public static synchronized SingleTon getInstance() {
if(instance==null) {
instance = new SingleTon();
}
return instance;
}
}
public class SingletonTest06 {
public static void main(String[] args) {
System.out.println("双重检查");
//测试
SingleTon instance1 = SingleTon.getInstance();
SingleTon instance2 = SingleTon.getInstance();
//其实拿到的是同一个实例对象
System.out.println(instance1==instance2);
//比较哈希码
System.out.println("instance1.hashCode()="+instance1.hashCode());
System.out.println("instance2.hashCode()="+instance2.hashCode());
}
}
class SingleTon {
private static volatile SingleTon instance; //保持内存可见,防止指令重排(一个实例创建好之后其余的线程可以立马知道)
private SingleTon () {}
//提供一个静态的公有方法 加入双重检查的代码,解决的了线程安全问题,同时解决懒加载问题
public static SingleTon getInstance() {
if(instance==null) {
synchronized (SingleTon.class) { //同步,每次只有一个线程进去
if(instance==null) {
instance = new SingleTon();
}
}
}
return instance;
}
}
public class SingletonTest07 {
public static void main(String[] args) {
System.out.println("静态内部类完成");
//测试
SingleTon instance1 = SingleTon.getInstance();
SingleTon instance2 = SingleTon.getInstance();
//其实拿到的是同一个实例对象
System.out.println(instance1==instance2);
//比较哈希码
System.out.println("instance1.hashCode()="+instance1.hashCode());
System.out.println("instance2.hashCode()="+instance2.hashCode());
}
}
//静态内部类 推荐使用
class SingleTon {
private static SingleTon instance;
//构造器私有化
private SingleTon () {}
//写一个静态内部类,该类中有一个静态的属性SingleTon
private static class SingleTonInstance {
//装载是安全的
private static final SingleTon INSTANCE = new SingleTon();
}
//提供一个静态的公有方法,直接返回SingleTonInstance的成员变量
public static SingleTon getInstance() {
return SingleTonInstance.INSTANCE;
}
}
public class SingleTonTest08 {
public static void main(String[] args) {
SingleTon instance1 = SingleTon.INSTANCE;
SingleTon instance2 = SingleTon.INSTANCE;
System.out.println(instance1==instance2);
System.out.println(instance1.hashCode());
System.out.println(instance2.hashCode());
instance1.sayOK();
}
}
//使用枚举可以使用单例
enum SingleTon {
INSTANCE; //属性,保证是一个单例
public void sayOK() {
System.out.println("OK~");
}
}
原文:https://www.cnblogs.com/xun-/p/12821314.html