新聞中心
前言
并發(fā)編程模型
我們之前給大家講了多線程的一些知識,首先我們要知道的是在并發(fā)編程模型下會產生兩大問題

創(chuàng)新互聯專注為客戶提供全方位的互聯網綜合服務,包含不限于成都網站設計、網站建設、遠安網絡推廣、成都微信小程序、遠安網絡營銷、遠安企業(yè)策劃、遠安品牌公關、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;創(chuàng)新互聯為所有大學生創(chuàng)業(yè)者提供遠安建站搭建服務,24小時服務熱線:028-86922220,官方網址:www.cdcxhl.com
- 線程之間如何通信
- 線程之間如何同步
解決這兩個問題主要有兩種并發(fā)模型:
- 消息傳遞模型
- 共享內存模型
那么它們是如何解決的呢?
消息傳遞模型
如何通信 ?
線程之間沒有公共狀態(tài),必須通過發(fā)消息來顯式通信
如何同步 ?
發(fā)消息本身就是同步的,因此它是隱式的
共享內存模型
如何通信 ?
線程之間共享程序的公共狀態(tài),通過讀寫內存中的公共狀態(tài)來進行隱式通信
如何同步 ?
需要顯示指定線程之間互斥執(zhí)行
在Java中使用的是第二種,共享內存并發(fā)模型的方式
Java內存模型結構
首先說一下運行時數據區(qū),主要分為兩類
- 線程共享區(qū),主要包含方法區(qū)和堆
- 線程私有區(qū),主要包含 虛擬機棧,本地方法棧,程序計數器
對于每一個線程來說,棧都是私有的,堆是共享的,所以棧中的變量,比如局部變量,方法定義參數、異常處理器參數,它們都不是共有的,所以內存之間是不可見的,所以也不收內存模型影響,而堆中的變量時共享的,所以又叫共享變量, 內存可見性是針對共享變量
堆中一定就可見性嗎
堆中也會出現內存不可見的問題,怎么產生的呢?這是因為現代計算機為了高效,往往會在高速緩存區(qū)中緩存共享變量,因為cpu訪問緩存區(qū)比訪問內存要快得多。
所謂內存不可見性,就是線程對某個共享變量在線程自己的緩沖中存在副本的時候對主內存中共享變量的值是不可見的,看不見主存中的值。線程操作一個共享變量時,它首先從主存中拉取并復制一份變量放置到自己的工作內存中,然后在工作內存中對變量進行修改,處理完之后將工作內存中的值重新寫回到主存中。所以在這個過程中,如果在緩存失效之前立即命中,就會導致更新過的主存中值不一致的問題
在Java中,每個線程都有自己的本地內存,存儲了該線程以讀、寫共享變量的副本,它是一個抽象的概念,線程之間的通信有內存模型控制,簡稱JMM
- 所有的共享變量都存在主內存中。
- 每個線程都保存了一份該線程使用到的共享變量的副本。
所以「線程間通信必須經過主內存」,JMM規(guī)定,「線程對共享變量的所有操作都必須在自己的本地內存中進行,不能直接從主內存中讀取」。
Java中的volatile關鍵字可以保證多線程操作共享變量的可見性以及禁止指令重排序,synchronized關鍵字不僅保證可見性,同時也保證了原子性(互斥性)。在更底層,JMM通過內存屏障來實現內存的可見性以及禁止重排序。為了程序員的方便理解,提出了happens-before,它更加的簡單易懂,從而避免了程序員為了理解內存可見性而去學習復雜的重排序規(guī)則以及這些規(guī)則的具體實現方法。
結束語
本節(jié)內容可能不像之前那么好理解,比較抽象,所以本文也有不足的地方,大家自己可以多查查一些資料,綜合理解。?
網站標題:面試官:說一下Java的共享內存模型
鏈接URL:http://www.5511xx.com/article/ccsggsi.html


咨詢
建站咨詢
