之前写过单例模式23种设计模式之单例模式
volatile关键字
- 防止重排序
如图:多线程的时候,可能会导致开辟内存之后直接将给变量复制了,导致重排序
- 线程可见性 - 某一个线程改了公用对象(变量),短时间内另一个线程可能是不可见的,因为每一个线程都有自己的缓存区(线程工作区)
如案例
public static void main(String[] args) {
ThreadDemo td = new ThreadDemo();
new Thread(td).start();
while(true){
if(td.isFlag()){
System.out.println("------------------");
break;
}
}
// 执行结果? flag= true ------------------
}
}
class ThreadDemo implements Runnable {
private boolean flag = false;
@Override
public void run() {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
}
flag = true;
System.out.println("flag=" + isFlag());
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
执行后只显示true而不打印——————,原因就是,多线程导致另一个线程是不可见导致 flag一直等于 false;加一个volite即可
单例设计模式之容器管理 系统的服务就是用的这种
public class Singleton {
private static HashMap<String,Object> mMap=new HashMap<>();
static {
mMap.put("Singleton", new Singleton());
}
private Singleton(){
}
public static Object get(String key){
return mMap.get(key);
}
}
单例模式之自己做一个
public class Singleton2 {
private static Singleton2 mInstance;
static {
mInstance=new Singleton2();
}
private Singleton2(){
}
public static Singleton2 getInstance(){
return mInstance;
}
}