对于代码的线程安全问题
import java.util.ArrayList;
import java.util.List;
public class Main {
// ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
int i;
public void increment() {
i++;
}
public static void main(String[] args) {
Main main = new Main();
Runnable runnable = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
main.increment();
System.out.println(main.i);
}
}
};
List<Thread> threads = new ArrayList<>(10);
for (int i = 0; i < 3; i++) {
Thread thread = new Thread(runnable);
threads.add(thread);
thread.start();
}
boolean flag = false;
while (!flag) {
flag = true;
for (Thread thread : threads) {
if (thread.isAlive()) {
flag = false;
}
}
}
System.out.println(main.i);
}
}
对于这个for循环中的System.out.println(main.i);
加上了这句话之后,每次输出的结果都是30000,这是为什么
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
不是线程安全是一定的,使用30,300个线程试试就知道了,让你产生安全的错觉在
System.out.println
是一个耗时的同步方法,就是它在很大程度上掩盖了i++
的可见性和原子性的问题。使用AtomicInteger
或synchronized
吧