引用我之前的回答---------
我个人认为是你把单例和线程安全搞混了,单例并不意味着线程安全,多线程同时访问单例同样存在并发问题,除非你手动加锁。下面通过一个例子说明,你觉得最后 count 会是多少?
public class Demo {
private int count;
public void add() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.count++;
}
public static void main(String[] args) {
Demo d = new Demo();
// 8个线程同时访问同一个 demo
new Thread(() -> {d.add();}).start();
new Thread(() -> {d.add();}).start();
new Thread(() -> {d.add();}).start();
new Thread(() -> {d.add();}).start();
new Thread(() -> {d.add();}).start();
new Thread(() -> {d.add();}).start();
new Thread(() -> {d.add();}).start();
new Thread(() -> {d.add();}).start();
// 主线程休眠 2 s ,等其他线程执行结束
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(d.count);
}
}