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,这是为什么
2 回答
明月笑刀无情
TA贡献1828条经验 获得超4个赞
不是线程安全是一定的,使用30,300个线程试试就知道了,让你产生安全的错觉在System.out.println是一个耗时的同步方法,就是它在很大程度上掩盖了i++的可见性和原子性的问题。使用AtomicInteger或synchronized吧
慕运维8079593
TA贡献1876条经验 获得超5个赞
开始以为是
public void println(int x) {
synchronized (this) {
print(x);
newLine();
}
}
后来发现我错了
方法本身的synchronized和被调用的方法的synchronized
确实是线程不安全的
跑300的结果
2999915
添加回答
举报
0/150
提交
取消
