Volatile 变量修饰符,只能修饰属性/静态属性
1.保证可见性(被修饰变量的可见性)
2.保证一定的顺序性(Object o = new Object());
3.保证 long/double 的原子性
4.不会导致线程切换
单例模式
某些类在进程的允许的过程中,只需要一个对象,不允许创建多个对象出来
Java中怎么写单例模式
1.饿汉模式
2.懒汉模式
一个简单的饿汉模式
class SingleTon{
private SingleTon(){}
private static SingleTon instance = new SingleTon();
public static SingleTon getInstance(){
return instance;
}
}
一个简单的懒汉模式
class SingleTon2{
private SingleTon2(){}
private static SingleTon2 instance = null;
public static SingleTon2 getInstance(){
if (instance == null){
instance = new SingleTon2();
}
return instance;
}
}
👇👇
class SingleTon2{
private SingleTon2(){}//不允许外部类构造对象
private static volatile SingleTon2 intance = null;//volatile 保证123的顺序
public static SingleTon2 getInstance(){
if (intance == null){
synchronized (SingleTon2.class){
if (intance == null){
intance = new SingleTon2(); // intance(3) = new(1) SingleTon2()(2)
// 这是一个有顺序的,123,但是cpu会优化顺序变成132
}
}
}
return intance;
}
}
为啥二次判断
- 如果加到外面就效率低,吃独食
- 再次判断是因为获得锁的过程是漫长的,很可能被调度出去了,所以要在判断