单例模式
publicclassSingleton1{
// 指向自己实例的私有静态引用,主动创建
privatestaticSingleton1 singleton1 = newSingleton1();
// 私有的构造方法
privateSingleton1(){}
// 以自己实例为返回值的静态的公有方法,静态工厂方法
publicstaticSingleton1 getSingleton1(){
returnsingleton1;
}
}
// 懒汉式单例
publicclassSingleton2{
// 指向自己实例的私有静态引用
privatestaticSingleton2 singleton2;
// 私有的构造方法
privateSingleton2(){}
// 以自己实例为返回值的静态的公有方法,静态工厂方法
publicstaticSingleton2 getSingleton2(){
// 被动创建,在真正需要使用时才去创建
if(singleton2 == null) {
singleton2 = newSingleton2();
}
returnsingleton2;
}
}
1)、同步延迟加载 — synchronized方法
// 线程安全的懒汉式单例
publicclassSingleton2{
privatestaticSingleton2 singleton2;
privateSingleton2(){}
// 使用 synchronized 修饰,临界资源的同步互斥访问
publicstaticsynchronizedSingleton2 getSingleton2(){
if(singleton2 == null) {
singleton2 = newSingleton2();
}
returnsingleton2;
}
}
2)、同步延迟加载 — synchronized块
// 线程安全的懒汉式单例
publicclassSingleton2{
privatestaticSingleton2 singleton2;
privateSingleton2(){}
publicstaticSingleton2 getSingleton2(){
synchronized(Singleton2.class){
// 使用 synchronized 块,临界资源的同步互斥访问
if(singleton2 == null) {
singleton2 = newSingleton2();
}
}
returnsingleton2;
}
}
3)、同步延迟加载 — 使用内部类实现延迟加载
// 线程安全的懒汉式单例
publicclassSingleton5{
// 私有内部类,按需加载,用时加载,也就是延迟加载
privatestaticclassHolder{
privatestaticSingleton5 singleton5 = newSingleton5();
}
privateSingleton5() {
}
publicstaticSingleton5 getSingleton5() {
returnHolder.singleton5;
}
}
4)双重检测
// 线程安全的懒汉式单例
publicclassSingleton3{
//使用volatile关键字防止重排序,因为 new Instance()是一个非原子操作,可能创建一个不完整的实例
privatestaticvolatileSingleton3 singleton3;
privateSingleton3() {
}
publicstaticSingleton3 getSingleton3() {
// Double-Check idiom
if(singleton3 == null) {
synchronized(Singleton3.class) { // 1
// 只需在第一次创建实例时才同步
if(singleton3 == null) { // 2
singleton3 = newSingleton3(); // 3
}
}
}
returnsingleton3;
}
}
5)ThreadLocal
publicclassSingleton{
// ThreadLocal 线程局部变量,将单例instance线程私有化
privatestaticThreadLocal<Singleton> threadlocal = new ThreadLocal<Singleton>();
privatestaticSingleton instance;
privateSingleton() {
}
publicstaticSingleton getInstance() {
// 第一次检查:若线程第一次访问,则进入if语句块;否则,若线程已经访问过,则直接返回ThreadLocal中的值
if(threadlocal.get() == null) {
synchronized(Singleton.class) {
if(instance == null) {
// 第二次检查:该单例是否被创建
instance = newSingleton();
}
}
threadlocal.set(instance); // 将单例放入ThreadLocal中
}
returnthreadlocal.get();
}
}
优质内容筛选与推荐>>