标签:Singleton return Mgr01 模式 INSTANCE static private 单例 public
1、饿汉式
private static final Mgr01 INSTANCE = new Mgr01();
public static Mgr01 getInstance(){
return INSTANCE;
}
2、饿汉式 改
3、懒汉式 线程不安全
public class Mgr01 {
private static Mgr01 INSTANCE ;
private Mgr01(){
}
public static Mgr01 getInstance(){
if (getInstance()==null){
INSTANCE = new Mgr01();
}else {
return INSTANCE;
}
return INSTANCE;
}
}
4、懒汉式 加同步锁
private static volatile Mgr01 INSTANCE ;
public synchronized static Mgr01 getInstance(){
if (INSTANCE==null){
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
INSTANCE = new Mgr01();
}else {
return INSTANCE;
}
return INSTANCE;
}
5、懒汉式 缩小同步锁
private static volatile Mgr01 INSTANCE ;
private Mgr01(){
}
public static Mgr01 getInstance(){
if (INSTANCE==null){ //有实例后不在走锁
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (Mgr01.class) {
if (INSTANCE == null) //确保只有一个实例
INSTANCE = new Mgr01();
}
}else {
return INSTANCE;
}
return INSTANCE;
}
6、内部类,最优写法
private Mgr01(){
}
public static Mgr01 getInstance(){
return Mgr01Holder.Instance;
}
private static class Mgr01Holder{
private static final Mgr01 Instance = new Mgr01();
}
7、枚举单例,最完美的
不但解决线程安全,还可以防止反序列化
public enum Mgr02 {
INSTANCE;
}
单例要防止反序列化,因为一般可以通过反射,new Instance();–走的无参构造方法创建对象。枚举没有构造方法,所以防止了反序列化。
volatile,因为java语言JIT优化时,编译后指令重排,导致会返回没有初始化的对象。
标签:Singleton,return,Mgr01,模式,INSTANCE,static,private,单例,public 来源: https://blog.csdn.net/qq_43575457/article/details/121734656
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。