京东面试题:Java中 ++i 的操作是线程安全的么?为什么?如何使其线程安全呢?
你真的了解volatile關(guān)鍵字嗎?http://blog.csdn.net/FansUnion/article/details/79495080
面試題:為什么最后兩行沒(méi)有運(yùn)行?http://blog.csdn.net/FansUnion/article/details/79625308
Java并發(fā)編程之CAS http://blog.csdn.net/FansUnion/article/details/79494554
如果是我答這道題:
先說(shuō)不是原子的,因?yàn)檫@個(gè)是分為三步,讀值,+1,寫值。在這三步任何之間都可能會(huì)有CPU調(diào)度產(chǎn)生,造成i的值被修改,造成臟讀臟寫。
接下來(lái)說(shuō)volatile不能解決這個(gè)線程安全問(wèn)題。因?yàn)関olatile只能保證可見性,不能保證原子性?;卮疬@個(gè)只為了讓面試官曉得你考慮周全,知識(shí)面廣。
接下來(lái)說(shuō)可以用鎖。使用synchronized或者ReentrantLock都可以解決這個(gè)問(wèn)題。這里還可以比較下這兩種方式的優(yōu)劣。教科書式的比較結(jié)束后,來(lái)一句“我認(rèn)為一般使用synchronized更好,因?yàn)镴VM團(tuán)隊(duì)一直以來(lái)都在優(yōu)先改進(jìn)這個(gè)機(jī)制,可以盡早獲得更好的性能,并且synchronized對(duì)大多數(shù)開發(fā)人員來(lái)說(shuō)更加熟悉,方便代碼的閱讀”。
最后補(bǔ)上AtomicInteger。為什么AtomicInteger使用CAS完成?因?yàn)閭鹘y(tǒng)的鎖機(jī)制需要陷入內(nèi)核態(tài),造成上下文切換,但是一般持有鎖的時(shí)間很短,頻繁的陷入內(nèi)核開銷太大,所以隨著機(jī)器硬件支持CAS后,JAVA推出基于compare and set機(jī)制的AtomicInteger,實(shí)際上就是一個(gè)CPU循環(huán)忙等待。因?yàn)槌钟墟i時(shí)間一般較短,所以大部分情況CAS比鎖性能更優(yōu)。
最初是沒(méi)有CAS,只有陷入內(nèi)核態(tài)的鎖,這種鎖當(dāng)然也需要硬件的支持。后來(lái)硬件發(fā)展了,有了CAS鎖,把compare 和 set 在硬件層次上做成原子的,才有了CAS鎖。
由于線程共享?xiàng)^(qū),不共享堆區(qū)和全局區(qū),所以當(dāng)且僅當(dāng) i 位于棧上是安全的,反之不安全。
2. AtomicInteger 和 各種 Lock 都可以確保線程安全。AtomicInteger 的效率高是因?yàn)樗腔コ鈪^(qū)非常小,只有一條指令,而 Lock 的互斥區(qū)是拿鎖到放鎖之間的區(qū)域,至少三條指令。
原文鏈接:http://group.jobbole.com/26557/
總結(jié)
以上是生活随笔為你收集整理的京东面试题:Java中 ++i 的操作是线程安全的么?为什么?如何使其线程安全呢?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CF977B Two-gram 题解
- 下一篇: hihoCoder #1183 : 连