一、ReentrantLock 與synchronized的區別
1. 兩者的共同點
●都是用來協調多線程對共享對象、變量的訪問
●都是可重入鎖,同一線程可以多次獲得同一個鎖
●都保證了可見性和互斥性
2. 兩者的不同點
●ReentrantLock 顯示的獲得、釋放鎖,synchronized 隱式獲得釋放鎖
●ReentrantLock 可響應中斷、可輪回,synchronized 是不可以響應中斷的,為處理鎖的不可用性提供了更高的靈活性
●ReentrantLock 是 API 級別的,synchronized 是 JVM 級別的
●ReentrantLock 可以實現公平鎖
●ReentrantLock 通過 Condition 可以綁定多個條件
●底層實現不一樣, synchronized 是同步阻塞,使用的是悲觀并發策略,lock 是同步非阻塞,采用的是樂觀并發策略
●Lock 是一個接口,而 synchronized 是 Java 中的關鍵字,synchronized 是內置的語言實現。
●synchronized 在發生異常時,會自動釋放線程占有的鎖,因此不會導致死鎖現象發生;而 Lock 在發生異常時,如果沒有主動通過 unLock()去釋放鎖,則很可能造成死鎖現象,因此使用 Lock 時需要在 finally 塊中釋放鎖。
●Lock 可以讓等待鎖的線程響應中斷,而 synchronized 卻不行,使用 synchronized 時,等待的線程會一直等待下去,不能夠響應中斷。
●通過 Lock 可以知道有沒有成功獲取鎖,而 synchronized 卻無法辦到。
●Lock 可以提高多個線程進行讀操作的效率,既就是實現讀寫鎖等。
二、 什么是線程的上下文切換?
巧妙地利用了時間片輪轉的方式, CPU 給每個任務都服務一定的時間,然后把當前任務的狀態保存下來,在加載下一任務的狀態后,繼續服務下一任務,任務的狀態保存及再加載, 這段過程就叫做上下文切換。時間片輪轉的方式使多個任務在同一顆 CPU 上執行變成了可能。
1. 進程
(有時候也稱做任務)是指一個程序運行的實例。在 Linux 系統中,線程就是能并行運行并且與他們的父進程(創建他們的進程)共享同一地址空間(一段內存區域)和其他資源的輕量級的進程。
2. 上下文
是指某一時間點 CPU 寄存器和程序計數器的內容。
3. 寄存器
是 CPU 內部的數量較少但是速度很快的內存(與之對應的是 CPU 外部相對較慢的 RAM 主內存)。寄存器通過對常用值(通常是運算的中間值)的快速訪問來提高計算機程序運行的速度。
4. 程序計數器
是一個專用的寄存器,用于表明指令序列中 CPU 正在執行的位置,存的值為正在執行的指令的位置或者下一個將要被執行的指令的位置,具體依賴于特定的系統。
5. PCB-“切換楨”
上下文切換可以認為是內核(操作系統的核心)在 CPU 上對于進程(包括線程)進行切換,上下文切換過程中的信息是保存在進程控制塊(PCB, process control block)中的。PCB 還經常被稱作“切換楨”(switchframe)。信息會一直保存到 CPU 的內存中,直到他們被再次使用。
6. 上下文切換的活動
●掛起一個進程,將這個進程在 CPU 中的狀態(上下文)存儲于內存中的某處。
●在內存中檢索下一個進程的上下文并將其在 CPU 的寄存器中恢復。
●跳轉到程序計數器所指向的位置(即跳轉到進程被中斷時的代碼行),以恢復該進程在程序中。
●引起線程上下文切換的原因
●當前執行任務的時間片用完之后,系統 CPU 正常調度下一個任務;
●當前執行任務碰到 IO 阻塞,調度器將此任務掛起,繼續下一任務;
●多個任務搶占鎖資源,當前任務沒有搶到鎖資源,被調度器掛起,繼續下一任務;
●用戶代碼掛起當前任務,讓出 CPU 時間;
●硬件中斷;
更多關于“Java培訓”的問題,歡迎咨詢千鋒教育在線名師。千鋒已有十余年的培訓經驗,課程大綱更科學更專業,有針對零基礎的就業班,有針對想提升技術的好程序員班,高品質課程助力你實現java程序員夢想。