日期:2014-05-20 浏览次数:20791 次
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(); } } }