題目描述
在學(xué)習(xí)多線程的知識(shí),下面的代碼跑出的結(jié)果與預(yù)想的不一致,看不明白問題出在哪里,麻煩大家?guī)兔纯?題目來源及自己的思路
我想的是程序結(jié)束后staticv的值是個(gè)整數(shù)200000,但是每次結(jié)果都在19xxxxxxx,離的很近,又不像同步出了問題,不知是哪里出了問題,另外代碼注釋標(biāo)注為#的位置,foo被synchronized標(biāo)志,那同步的是SyncObj的實(shí)例對(duì)象而不是SyncObjc.class,明明是兩個(gè)實(shí)例對(duì)象在被調(diào)用沒有加同步,我以為volatile沒加上去結(jié)果是錯(cuò)誤的,但執(zhí)行的結(jié)果好像沒區(qū)別,為什么?我不清楚我的理解哪里出了問題,請(qǐng)大家多多指教,謝謝。
相關(guān)代碼
package concurrency;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class SynchronizedTest {
public static void main(String[] args) throws InterruptedException {
ExecutorService executor = Executors.newCachedThreadPool();
SyncObj obj1 =new SyncObj();
SyncObj obj2 =new SyncObj();
CountDownLatch countDownLatch = new CountDownLatch(20);
for(int i=0;i<10;i++) {
executor.execute(new TT(obj1,countDownLatch));
executor.execute(new TT(obj2,countDownLatch));
}
countDownLatch.await();
System.out.println("result----------------------"+SyncObj.staticv);
}
}
class SyncObj {
public static volatile int staticv = 0; //######volatile是不是可有可無?
public synchronized void foo() {
for(int i=0;i<1000;i++) {
System.out.println(staticv);
staticv++;
}
}
}
class TT implements Runnable{
public CountDownLatch countDownLatch;
public SyncObj obj;
public TT( SyncObj obj,CountDownLatch countDownLatch) {
this.obj=obj;
this.countDownLatch = countDownLatch;
}
@Override
public void run() {
for(int i=0;i<100;i++) {
obj.foo();
}
countDownLatch.countDown();
}
}
添加回答
舉報(bào)
0/150
提交
取消