日期:2014-05-20 浏览次数:20974 次
public class Controller {
private static Controller instance;
private static Object lock = new Object();
private Controller()
{
// do something
}
public final static Controller getInstance(){
if (instance != null)
return instance;
synchronized (lock){
if (instance != null)
return instance;
Controller tmp = new Controller();
instance = tmp;
}
return instance;
}
// some more methods
}
------解决方案--------------------
路过,学习
------解决方案--------------------
public class Tiger6 {
static class Inner {
private static Inner instance = null;
private Inner() { // 每调用一次构造函数,打印一条消息。
System.out.println("create a Inner object!");
}
public static Inner getInstance() {
if (instance == null) {
//主要问题是出现在这里的。当一个线程判断instance == null,然后时间片到期
//另外一个线程进入判断为空,然后创建Inner()对象。当开始的线程运行时从这里
//开始然后又创建了Inner()这样的话,就执行了两次,当然这种情况是不可控的,
//有多少个线程每一次运行的时候是不确定的,所以就会出现多种情况。我们开的线程
//越多,这种情况就越有可能出现。总之这里线程不是安全的,加上synchronized
//关键字后,就可以解决这个问题了。
//如果在下面加上Thread.sleep(10),那么create a Inner object!就会出现100次。
//每一次都会出现上面的情况。
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
instance = new Inner();
}
return instance;
}
}
public static void main(String[] args) {
Thread[] ts = new Thread[100];
for (int i = 0; i < ts.length; i++) {
System.out.println(i);
ts[i] = new Thread(new Runnable() {
public void run() {
Inner.getInstance();
}
});
}
for (Thread t : ts) {
t.start();
}
}
}