南京達內IT培訓
美國上市IT培訓機構

025-66630866

熱門課程

Java內存模型常見問題解析

  • 時間:2016-06-16 18:02
  • 發布:南京達內培訓學校
  • 來源:企業面試題

南京達內培訓講師表示,Java內存模型規定所有的變量都是存在主存當中(類似于前面說的物理內存),每個線程都有自己的工作內存(類似于前面的高速緩存)。線程對變量的所有操作都必須在工作內存中進行,而不能直接對主存進行操作。并且每個線程不能訪問其他線程的工作內存。也就是說,在java內存模型中,也會存在緩存一致性問題和指令重排序的問題。

1.原子性

在Java中,對基本數據類型(除了long和double)的變量的讀取和賦值操作是原子性操作,即這些操作是不可被中斷的,要么執行,要么不執行。還有一些原子類,如AtomicInteger、AtomicBoolean等等。

2.可見性

對于可見性,Java提供了volatile關鍵字來保證可見性。

當一個共享變量被volatile修飾時,它會保證修改的值會立即被更新到主存,當有其他線程需要讀取時,它會去內存中讀取新值。

而普通的共享變量不能保證可見性,因為普通共享變量被修改之后,什么時候被寫入主存是不確定的,當其他線程去讀取時,此時內存中可能還是原來的舊值,因此無法保證可見性。

另外,通過synchronized和Lock也能夠保證可見性,synchronized和Lock能保證同一時刻只有一個線程獲取鎖然后執行同步代碼,并且在釋放鎖之前會將對變量的修改刷新到主存當中。因此可以保證可見性。

3.有序性

在Java內存模型中,允許編譯器和處理器對指令進行重排序,但是重排序過程不會影響到單線程程序的執行,卻會影響到多線程并發執行的正確性。

在Java里面,可以通過volatile關鍵字來保證一定的有序性。另外可以通過synchronized和Lock來保證有序性,很顯然,synchronized和Lock保證每個時刻是有一個線程執行同步代碼,相當于是讓線程順序執行同步代碼,自然就保證了有序性。
上一篇:Java線程的join方法
下一篇:學習java技術的優勢有哪些
選擇城市和中心
江西省

貴州省

廣西省

海南省

网址在线观看你懂我意思吧