饿汉式单例不会存在同步问题
package cn.java.thread;
public class Single {
//饿汉式
private static Single s =new Single();
private Single(){}
public static Single getInstance(){
return s;
}
}
class Demo implements Runnable{
@Override
public void run() {
Single.getInstance();
}
}
对共享数据s不存在着多条操作。
但是懒汉式单例却会有同步问题
package cn.java.thread;
public class Single {
//饿汉式
private static Single s =null;
private Single(){}
public static Single getInstance() throws Exception{
if(s==null){
//线程在此处会出现同步问题
Thread.sleep(10);
s = new Single();
}
return s;
}
}
class Demo implements Runnable{
@Override
public void run() {
try {
Single.getInstance();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
通过双重判断可以提高同步效率
public class Single {
private static Single s =null;
private Single(){}
public static Single getInstance() throws Exception{
if(s==null){
synchronized(Single.class){
if(s==null){
//线程在此处会出现同步问题
Thread.sleep(10);
s = new Single();
}
}
}
return s;
}
}