面試中關於線程池的 4 連擊

講一下Java內存模型

在 JDK1.2 之前,Java的內存模型實現總是從

主存(即共享內存)讀取變量,是不需要進行特別的注意的。而在當前的 Java 內存模型下,線程可以把變量保存本地內存(比如機器的寄存器)中,而不是直接在主存中進行讀寫。這就可能造成一個線程在主存中修改了一個變量的值,而另外一個線程還繼續使用它在寄存器中的變量值的拷貝,造成數據的不一致

面試中關於線程池的 4 連擊

要解決這個問題,就需要把變量聲明為 volatile,這就指示 JVM,這個變量是不穩定的,每次使用它都到主存中進行讀取。說白了, volatile 關鍵字的主要作用就是保證變量的可見性然後還有一個作用是防止指令重排序。

面試中關於線程池的 4 連擊

說說 synchronized 關鍵字和 volatile 關鍵字的區別

synchronized關鍵字和volatile關鍵字比較

volatile關鍵字是線程同步的輕量級實現,所以volatile性能肯定比synchronized關鍵字要好。但是volatile關鍵字只能用於變量而synchronized關鍵字可以修飾方法以及代碼塊。synchronized關鍵字在JavaSE1.6之後進行了主要包括為了減少獲得鎖和釋放鎖帶來的性能消耗而引入的偏向鎖和輕量級鎖以及其它各種優化之後執行效率有了顯著提升,實際開發中使用 synchronized 關鍵字的場景還是更多一些。

多線程訪問volatile關鍵字不會發生阻塞,而synchronized關鍵字可能會發生阻塞

volatile關鍵字能保證數據的可見性,但不能保證數據的原子性。synchronized關鍵字兩者都能保證。

volatile關鍵字主要用於解決變量在多個線程之間的可見性,而 synchronized關鍵字解決的是多個線程之間訪問資源的同步性。

講到最後,給粉絲們送一波福利,關注並轉發文章後,私信找我要資料,回覆“Java面試”

面試中關於線程池的 4 連擊

面試中關於線程池的 4 連擊

面試中關於線程池的 4 連擊

面試中關於線程池的 4 連擊

面試中關於線程池的 4 連擊

面試中關於線程池的 4 連擊

面試中關於線程池的 4 連擊


分享到:


相關文章: