最近在学习多线程的同步代码块,其中在测试线程集合不安全的案例时,发现在synchronized同步代码块下,如果不使用sleep()来休眠的话,并不能完全保证安全,想不明白原因是什么?
//这是符合预期的代码 最后的结果为10000
public class ThreadList {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
new Thread(() -> {
synchronized (list) {
list.add(Thread.currentThread().getName());
}
}).start();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(list.size());
}
}
下面当把sleep()的休眠时间减下去后,或者直接取消休眠时间后,实际的输出结果就会低于10000,synchronized并没有能保证线程安全
//将休眠取消后,同步块并没有能保证线程的安全
public class ThreadList {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
new Thread(() -> {
synchronized (list) {
list.add(Thread.currentThread().getName());
}
}).start();
}
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
System.out.println(list.size());
}
}