目录
5.枚举单例(最优解,不仅可以解决线程同步,还可以防止反序列化)
一.单模单例
类加载到内存后,就实例化一个单例。
1.饿汉式加载
直接实例化(占用空间)
private static final Mgr01 INSTANCE = new Mgr01();
//实例化唯一的Mgr01单例
private Mgr01(){
//
};
//不允许外部调用,即不可随意new();
2.懒汉式加载(Lazy loading)
不直接实例化,而是在需要实例化时进行判断(线程不安全)
可以加上锁synchronized
3.较为完善的单例写法(锁+双重判空):
private static final Mgr01 INSTANCE = new Mgr01();
private Mgr01(){
//
};
public static Mgr01 getinstance(){
if(instance == null){
synchronized(Mgr01.class){
if(instance == null){
//操作语句
INSTANCE = new Mgr01();
}
}
}
return INSTANCE;
}
4.静态内部类方式(饿汉加懒汉式,完美)
private static class Mgr01Holder{
private static final Mgr01 INSTANCE = new Mgr01();
}
//内部调用实例化单例
private static Mgr01 getInstance(){
return Mgr01Holder.INSTANCE;
}
//仅返回内部实例化好的单例
5.枚举单例(最优解,不仅可以解决线程同步,还可以防止反序列化)
java中的枚举语法,不适用与C#
public enum Mgr01{
INSTANCE;//只有一个取值,为INSTANCE
public static void main(String[] args){
for(int i=0; i<100; i++){
new Thread())->{
//方法内容
System.out.println(Mgr01.INSTANCE.hashCode());
//在调用时,直接调用哈希值
}.start();
}
}
}
二.策略模式
1.新创建一个类,以该类进行大小比较
后续待补充
拓展:
1.new线程
new Thread(new Runnable(){
@Override
public void run(){
//方法内容
}
}).start();
语法糖(由于线程新建一定会有Runnable()类及唯一run()方法)
所以代码可以简化为
new Thread())->{
//方法内容
}.start();
2.hasecode()
同一个类的不同对象的hasecode是不一样的
3.判断句的语法糖
minPos = arr[i] < arr[minPos] ? j : minPos;
//true为j,false为minPos