单例模式
单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
单例模式的实现:1. 懒汉式 2.饿汉式
饿汉式比较好不涉及到线程安全的问题
为什么说饿汉式天生就是线程安全的?
因为当我们声明一个全局的变量用来存储这个对象的时候就已经将它new了出来,并且这个全局的变量还是static的所以他是线程安全的。
static的变量会随着累的加载而初始化,而且类的加载只会加载一次。
懒汉式涉及到线程安全的问题
单例模式(懒汉式)的几种实现方法
1.普通
public class Singleton1 {
private static Singleton1 Singleton1;
private Singleton1() {
}
public static Singleton1 getSinglteon() {
if (Singleton1 == null) {
Singleton1 = new Singleton1();
}
return Singleton1;
}
}
2.线程安全
/*
线程安全的单例
*/
public class Singleton2 {
private static Singleton2 Singleton2;
private Singleton2() {
}
public static Singleton2 getSinglteon() {
synchronized (Singleton2.class) {
if (Singleton2 == null) {
Singleton2 = new Singleton2();
}
}
return Singleton2;
}
}
3.效率高的线程安全(双检查锁)
/*
doublechecklock
线程安全的单例
*/
public class Singleton3 {
private static Singleton3 Singleton3;
private Singleton3() {
}
public static Singleton3 getSinglteon() {
if (Singleton3 == null) {
synchronized (Singleton3.class) {
if (Singleton3 == null) {
Singleton3 = new Singleton3();
}
}
}
return Singleton3;
}
}
4.利用类加载机制实现线程安全
/*
线程安全的单例 内部类实现
*/
public class Singleton4 {
private Singleton4() {
}
private static class in {
private static final Singleton4 singleton4 = new Singleton4();
}
public static Singleton4 getInstance(){
return in.singleton4;
}
}