我在整理Java并發(fā)相關知識點的時候微峰,準備寫個多線程不安全的例子來放在博客里面,由例子引出相關知識點來幫助自己理解抒钱,結果太讓我意外了……So,特發(fā)此文尋大佬答疑解惑……
這個例子在網(wǎng)上很常見,我不知道那些文章的作者在寫文章的時候谋币,自己有沒有去試試仗扬。
來,F(xiàn)or example:
public int count = 0;
public int TestVolatile(){
final CountDownLatch countDownLatch = new CountDownLatch(1000);
for (int i = 0; i < 1000; i++) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
}
count++;
countDownLatch.countDown();
}
}).start();
}
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("<<<<<"+count);
return count;
}
Log:
System.out: <<<<<1000
理論上蕾额,上面例子肯定是線程不安全的早芭,返回結果肯定是<=1000的。
我本來以為是概率問題诅蝶,并發(fā)一千萬次退个,結果沒有一次是不安全的,返回結果都是:1000
于是我又嘗試把int
改為Integer
:
public Integer count = 0;
public int TestVolatile(){
final CountDownLatch countDownLatch = new CountDownLatch(1000);
for (int i = 0; i < 1000; i++) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
}
count++;
countDownLatch.countDown();
}
}).start();
}
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("<<<<<"+count);
return count;
}
Log:
03-18 03:00:16.098 5569-5569/com.example.myapplication I/System.out: <<<<<863
03-18 03:01:55.414 5569-5569/com.example.myapplication I/System.out: <<<<<1000
03-18 03:01:58.210 5569-5569/com.example.myapplication I/System.out: <<<<<976
03-18 03:02:00.426 5569-5569/com.example.myapplication I/System.out: <<<<<925
從Log可以看出调炬,改成Integer
之后線程不安全了语盈。
按道理來說倆個都是線程不安全的,返回結果應該都是<=1000
Why缰泡?刀荒??
誰知道為什么棘钞?
結果來了:
我在安卓環(huán)境中:
第一種情況我個人試了確實為1000缠借,但是有網(wǎng)友試出來有<1000的情況,證明確實是線程不安全宜猜,只是概率問題泼返。
如果哪位大佬有高見,歡迎留言姨拥,看到會第一時間回復绅喉。再次感謝各位廣大網(wǎng)友。