java多線程之內存模型

java多線程之內存模型


內存模型和Java內存模型

1.什麼是內存模型(Memory Model)?

對於處理器而言,一個內存模型就是定義一些充分必要的規範,這些規範使得其他處理器對內存的寫操作對當前處理器可見,當前處理器的寫操作對其他處理器可見。特別說明:其他處理器對內存的寫一定發生在當前處理器對同一內存的讀之前,稱之爲其他處理器對內存的寫對當前處理可見。

通俗一點來說,內存模型的其中一個作用就是確保處理器在處理數據時的數據同步。對於這個理解,個人認爲可以與數據庫的事務做一定的參考。在數據庫中處理事務時,對於併發操作來說爲了保證數據的原子性和一致性常常使用鎖機制(這裏的理解可能有些片面,畢竟個人理解並不是特別深入,歡迎指正)。而對於“可見性”這個概念會在後面的文章中解釋。

2.Java內存模型(JMM)
同樣地,Java內存模型就是一套規範,在這套規範中包含:

  • 線程之間如何通過內存通信
  • 線程之間通過什麼方式通信才合法,才能得到期望的結果

而在這套規範中規定的內存結構是這樣的:
簡單講,Java內存模型將內存分爲共享內存和本地內存。共享內存又稱爲堆內存,指的就是線程之間的共享的內存包含所有的實例域、靜態域和數組元素。每個線程都有一個私有的、只對自己可見的內存,稱之爲本地內存。具體請參考infoQ上文章,講的比較具體。
Java內存模型中的內存結構如下圖所示:
這裏寫圖片描述
共享內存中共享變量雖然有所有的線程共享,但是爲了提高效率,線程並不直接使用這些變量,每個線程都會在自己的本地內存中存儲一個共享內存的副本,使用這個副本參與運算。由於這個副本的參與,導致了線程之間對共享內存的讀取存在可見性問題。爲了方便線程之間的通信,Java提供了volatile、synchronized、final三個關鍵字供我們使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章