对于代码的线程安全问题

importjava.util.ArrayList;
importjava.util.List;
publicclassMain{
//ThreadLocalthreadLocal=newThreadLocal<>();
inti;
publicvoidincrement(){
i++;
}
publicstaticvoidmain(String[]args){
Mainmain=newMain();
Runnablerunnable=newRunnable(){
@Override
publicvoidrun(){
for(inti=0;i<10000;i++){
main.increment();
System.out.println(main.i);
}
}
};
Listthreads=newArrayList<>(10);
for(inti=0;i<3;i++){
Threadthread=newThread(runnable);
threads.add(thread);
thread.start();
}
booleanflag=false;
while(!flag){
flag=true;
for(Threadthread:threads){
if(thread.isAlive()){
flag=false;
}
}
}
System.out.println(main.i);
}
}
对于这个for循环中的System.out.println(main.i);加上了这句话之后,每次输出的结果都是30000,这是为什么
一只萌萌小番薯
浏览 289回答 2
2回答

哆啦的时光机

不是线程安全是一定的,使用30,300个线程试试就知道了,让你产生安全的错觉在System.out.println是一个耗时的同步方法,就是它在很大程度上掩盖了i++的可见性和原子性的问题。使用AtomicInteger或synchronized吧

缥缈止盈

开始以为是publicvoidprintln(intx){synchronized(this){print(x);newLine();}}后来发现我错了方法本身的synchronized和被调用的方法的synchronized确实是线程不安全的跑300的结果2999915
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript