这里有安全问题,当多个线程进来之后,在执行判断和创建对象之间可能出现cpu在线程之间的切换,一旦cpu切换了线程,就会导致每个线程都创建一个当前单例类的对象,这样就会导致当前的单例类不再保证对象唯一了。通过同步来解决这个问题。
class Single {
private Single() {
}
private static Single s = null;
public static Single get() {
if (s == null) { //提高效率,不让线程每次都运行同步。
synchronized (Demo1.class) {
if (s == null) {
s=new Single();
}
}
}
return s;
}
}
class Show implements Runnable {
public void run() {
Single s = Single.get();
System.out.println(s);
}
}
class Demo1 {
public static void main(String[] args) {
Show s = new Show();
Thread t = new Thread(s);
Thread t2 = new Thread(s);
t.start();
t2.start();
}
}