public?class?SecondThread?implements?Runnable?{
????int?i;
????@Override
????public?void?run()?{
????????for(;i<20;i++){
????System.out.println(Thread.currentThread().getName()+"-"+i);
}
????}
????public?static?void?main(String[]?args)?{
for(int?i=0;i<20;i++){
????System.out.println(Thread.currentThread().getName()+"-"+i);
????if(i==10){
????????SecondThread?st=new?SecondThread();
????new?Thread(st,"線程1").start();
????new?Thread(st,"線程2").start();
????}
}
????}
}輸出結(jié)果中 線程1和線程2后面的i應(yīng)該是共享的并且連續(xù)的,如線程2-0、線程1-1、線程1-2、線程2-3、線程1-4、線程1-5、線程2-6...但我跑了很多次,發(fā)現(xiàn)每次線程1和線程2都會(huì)輸出0:線程1-0,線程2-0。但后面的數(shù)字就是連續(xù)交替的的,為什么偏偏這個(gè)0都會(huì)輸出一次?
2 回答

半枯
TA貢獻(xiàn)101條經(jīng)驗(yàn) 獲得超45個(gè)贊
你這還算是好的,如果你不是寫for對i的判斷進(jìn)行小于20的判斷,而是通過if判斷某個(gè)值,那么就會(huì)出現(xiàn)超值,就是一直跑下去.

慕娘0009941
TA貢獻(xiàn)1條經(jīng)驗(yàn) 獲得超0個(gè)贊
首先 i++ 本身并不是一個(gè)原子操作,其次還存在內(nèi)存可見的問題。比較簡單的解決方法有兩種都可以達(dá)到你想要的效果 (1)用 volatile 關(guān)鍵字 修飾共享變量 i? ?(2)將 i 的訪問都封裝到一個(gè)方法里,并用 synchronized 添加同步保護(hù)
添加回答
舉報(bào)
0/150
提交
取消