京东面试题:Java中 ++i 的操作是线程安全的么?为什么?如何使其线程安全呢?
你真的了解volatile關鍵字嗎?http://blog.csdn.net/FansUnion/article/details/79495080
面試題:為什么最后兩行沒有運行?http://blog.csdn.net/FansUnion/article/details/79625308
Java并發編程之CAS http://blog.csdn.net/FansUnion/article/details/79494554
如果是我答這道題:
先說不是原子的,因為這個是分為三步,讀值,+1,寫值。在這三步任何之間都可能會有CPU調度產生,造成i的值被修改,造成臟讀臟寫。
接下來說volatile不能解決這個線程安全問題。因為volatile只能保證可見性,不能保證原子性。回答這個只為了讓面試官曉得你考慮周全,知識面廣。
接下來說可以用鎖。使用synchronized或者ReentrantLock都可以解決這個問題。這里還可以比較下這兩種方式的優劣。教科書式的比較結束后,來一句“我認為一般使用synchronized更好,因為JVM團隊一直以來都在優先改進這個機制,可以盡早獲得更好的性能,并且synchronized對大多數開發人員來說更加熟悉,方便代碼的閱讀”。
最后補上AtomicInteger。為什么AtomicInteger使用CAS完成?因為傳統的鎖機制需要陷入內核態,造成上下文切換,但是一般持有鎖的時間很短,頻繁的陷入內核開銷太大,所以隨著機器硬件支持CAS后,JAVA推出基于compare and set機制的AtomicInteger,實際上就是一個CPU循環忙等待。因為持有鎖時間一般較短,所以大部分情況CAS比鎖性能更優。
最初是沒有CAS,只有陷入內核態的鎖,這種鎖當然也需要硬件的支持。后來硬件發展了,有了CAS鎖,把compare 和 set 在硬件層次上做成原子的,才有了CAS鎖。
由于線程共享棧區,不共享堆區和全局區,所以當且僅當 i 位于棧上是安全的,反之不安全。
2. AtomicInteger 和 各種 Lock 都可以確保線程安全。AtomicInteger 的效率高是因為它是互斥區非常小,只有一條指令,而 Lock 的互斥區是拿鎖到放鎖之間的區域,至少三條指令。
原文鏈接:http://group.jobbole.com/26557/
總結
以上是生活随笔為你收集整理的京东面试题:Java中 ++i 的操作是线程安全的么?为什么?如何使其线程安全呢?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【面试真题】ThoughtWorks-编
- 下一篇: 关于 Task 简单梳理