問:synchronized和ReentrantLock的區別?java
ReentrantLock(可重入鎖)數組
ReentrantLock公平性設置緩存
ReentrantLock fairLock = new ReentrantLock(true);
參數爲ture時,傾向於將鎖賦予等待時間最久的線程安全
公平鎖:獲取鎖的順序按前後調用lock方法的順序(慎用,一般公平性沒有想象的那麼重要,java默認的調用策略不多會有飢餓狀況的發生,與此同時若要保證公平性,會增長額外的開銷,致使必定的吞吐量降低)多線程
非公平鎖:獲取鎖的順序是無序的,synchronized是非公平鎖併發
例子:app
package interview.thread; import java.util.concurrent.locks.ReentrantLock; /** * @Author: cctv * @Date: 2019/5/21 11:46 */ public class ReentrantLockDemo implements Runnable { private static ReentrantLock lock = new ReentrantLock(false); @Override public void run() { while (true) { lock.lock(); System.out.println(Thread.currentThread().getName() + " get lock"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } } public static void main(String[] args) { ReentrantLockDemo rtld = new ReentrantLockDemo(); Thread t1 = new Thread(rtld); Thread t2 = new Thread(rtld); t1.start(); t2.start(); } }
公平鎖 new ReentrantLock(true);框架
非公平鎖 new ReentrantLock(false);jvm
ReentrantLock將鎖對象化ide
是否能將wait\notify\notifyAll對象化
總結synchronized和ReentrantLock的區別:
問:什麼是Java內存模型中的happens-before?
java內存模型(即Java Memory Model 簡稱JMM)是一種抽象概念,並不真實存在,它描述的是一組規則或規範,經過這組規範定義了程序中各個變量(包括實例字段,靜態字段和構成數組對象的元素)的訪問方式
JMM中的主內存
JMM中的工做內存
JMM和java內存區域劃分是不一樣的概念層次:
主內存和工做內存的數據存儲類型以及操做方式概括:
JMM如何解決可見性問題?
首先要講下重排序:在執行程序時,爲了提升性能,編譯器和處理器經常會對指令作重排序。
指令重排序須要知足的條件:
happens-before的八大原則:
若是兩個操做不知足上述任意一個happens-before規則,那麼這兩個操做就沒有順序的保障,JVM能夠對這兩個操做進行重排序
若是操做A happens-before B 那麼操做A在內存上所作的操做對操做B都是可見的
volatile:jvm提供的輕量級同步機制,解決了內存可見性問題,但並非線程安全的(能夠配合synchronized達到線程安全目的)
問:volatile變量如何當即可見?
當寫一個volatile變量時,JMM會把該線程對應的工做內存中的共享變量刷新到主內存中
當讀取一個volatile變量時,JMM會把該線程對應的工做內存置爲無效,該線程只能從主內存中讀取變量
問:volatile變量如何禁止重排優化?
內存屏障(Memory Barrier)
經過插入內存屏障指令禁止在內存屏障先後的指令執行重排序優化,強制刷出各類CPU的緩存數據,所以任何CPU上的線程都能讀取到這些數據的最新版本
package interview.thread; /** * 單例模式的雙重檢測實現 * * @Author: cctv * @Date: 2019/5/21 17:19 */ public class Singleton { // 禁止指令重排序優化 private volatile static Singleton instance; private Singleton() { } public static Singleton getInstance() { //第一次檢測 if (instance == null) { //同步 synchronized (Singleton.class) { // 第二次檢測 if (instance == null) { // 多線程環境下可能會出現問題的地方(會出現指令重排序,致使instance先賦值後初始化Singleton) instance = new Singleton(); } } } return instance; } }
volatile和synchronized的區別
問:談談 CAS(Compare and Swap)?
一種高效實現線程線程安全的方法
cas思想:
包含三個操做數--內存位置V 預期原值A 和 新增B
缺點: