单例模式(java代码实现)应⽤单例模式时,类只能有⼀个对象实例,这么做的⽬的是避免不⼀致状态。
饿汉式单例:(⽴即加载)
// 饿汉式单例
public class Singleton1 {
// 指向⾃⼰实例的私有静态引⽤,主动创建
private static Singleton1 singleton1 = new Singleton1();
// 私有的构造⽅法
private Singleton1(){}
// 以⾃⼰实例为返回值的静态的公有⽅法,静态⼯⼚⽅法
public static Singleton1 getSingleton1(){
return singleton1;
}
}
懒汉式单例:(延迟加载)
// 懒汉式单例
public class Singleton2 {
// 指向⾃⼰实例的私有静态引⽤
private static Singleton2 singleton2;
// 私有的构造⽅法
private Singleton2(){}
// 以⾃⼰实例为返回值的静态的公有⽅法,静态⼯⼚⽅法
public static Singleton2 getSingleton2(){
/
/ 被动创建,在真正需要使⽤时才去创建
if (singleton2 == null) {
singleton2 = new Singleton2();
}
return singleton2;
}
}
多线程下线程安全的懒汉式单例(饿汉式本⾝是线程安全的):1)、同步延迟加载 — synchronized⽅法
private static Singleton2 singleton2;
private Singleton2(){}
// 使⽤ synchronized 修饰,临界资源的同步互斥访问
public static synchronized Singleton2 getSingleton2(){
if (singleton2 == null) {
singleton2 = new Singleton2();
}
return singleton2;
}
单例模式的几种实现方式}
2)、同步延迟加载 — synchronized块
// 线程安全的懒汉式单例
public class Singleton2 {
private static Singleton2 singleton2;
private Singleton2(){}
public static Singleton2 getSingleton2(){
synchronized(Singleton2.class){ // 使⽤ synchronized 块,临界资源的同步互斥访问 if (singleton2 == null) {
singleton2 = new Singleton2();
}
}
return singleton2;
}
}
3)、同步延迟加载 — 使⽤内部类实现延迟加载
// 线程安全的懒汉式单例
public class Singleton5 {
// 私有内部类,按需加载,⽤时加载,也就是延迟加载
private static class Holder {
private static Singleton5 singleton5 = new Singleton5();
}
private Singleton5() {
}
public static Singleton5 getSingleton5() {
return Holder.singleton5;
}
}
4)双重检测
//使⽤volatile关键字防⽌重排序,因为 new Instance()是⼀个⾮原⼦操作,可能创建⼀个不完整的实例
private static volatile Singleton3 singleton3;
private Singleton3() {
}
public static Singleton3 getSingleton3() {
// Double-Check idiom
if (singleton3 == null) {
synchronized (Singleton3.class) { // 1
// 只需在第⼀次创建实例时才同步
if (singleton3 == null) { // 2
singleton3 = new Singleton3(); // 3
}
}
}
return singleton3;
}
}
5)ThreadLocal
public class Singleton {
// ThreadLocal 线程局部变量,将单例instance线程私有化
private static ThreadLocal<Singleton> threadlocal = new ThreadLocal<Singleton>();
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
// 第⼀次检查:若线程第⼀次访问,则进⼊if语句块;否则,若线程已经访问过,则直接返回ThreadLocal中的值 if (() == null) {
synchronized (Singleton.class) {
if (instance == null) { // 第⼆次检查:该单例是否被创建
instance = new Singleton();
}
}
threadlocal.set(instance); // 将单例放⼊ThreadLocal中
}
();
}
}
引⽤《》
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论