日期:2014-05-20 浏览次数:20824 次
public class lazySingleton {
private static volatile lazySingleton m_instance=null;
private lazySingleton() {
// TODO Auto-generated constructor stub
System.out.println("构造函数");
}
public static lazySingleton getInstance(){
if(m_instance==null){
synchronized (lazySingleton.class) {
if(m_instance==null){
m_instance=new lazySingleton(); //疑惑一
}
}
}
return m_instance;
}
public void print(){
System.out.println("print");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
lazySingleton.getInstance().print();
}
}
synchronized public static lazySingleton getInstance(){
if(m_instance==null){
m_instance=new lazySingleton();
}
return m_instance;
}
public static lazySingleton getInstance(){
if(m_instance==null){ // B线程检测到m_instance不为空
synchronized (lazySingleton.class) {
if(m_instance==null){
m_instance=new lazySingleton(); // A线程被指令重排了,刚好先赋值了;但还没执行完构造函数。
}
}
}
return m_instance; // 后面B线程执行时将引发:对象尚未初始化错误。
}
------解决方案--------------------
http://icyfenix.iteye.com/blog/575052
------解决方案--------------------
不是你说的那个意思啊。
没加volatile的问题最多也只是B线程看不到A线程的赋值而已,那么无非是if条件成立,进入synchronized进行等待。
恰恰是加了volatile,才让B线程能更好的立即看到A线程的赋值;从而B线程可以调用一个无效对象。
------解决方案--------------------
诚惶诚恐
volatile的作用:http://www.ticmy.com/?p=118
如果楼主只是从源码角度去看多线程代码,很多并发问题是看不出来的,如果以前没有接触过,可先查阅 java内存模型 (Java Memory Model) 相关资料