第一個問題:為什么outcome變量不加上volatile,以及在set和setException方法中,要專門的UNSAFE.putOrderedInt已經(jīng)加上volatile的state方法?因為我個人認為,outcomme會被多個線程訪問(一個可以讀寫,其他的只能讀),這種情況下,為啥不加上volatile,加上volatile的好處可以讓outcome和state變量被修改后,其他線程立刻知道?而為什么作者故意不使用volatile的特性呢?/**Theresulttoreturnorexceptiontothrowfromget()*/privateObjectoutcome;//non-volatile,protectedbystatereads/writesprotectedvoidset(Vv){if(UNSAFE.compareAndSwapInt(this,stateOffset,NEW,COMPLETING)){outcome=v;UNSAFE.putOrderedInt(this,stateOffset,NORMAL);//finalstatefinishCompletion();}}
為什么FutureTask類的outcome變量不需要加上volatile修飾?十分感謝
慕工程0101907
2019-06-19 09:10:00