您好,登錄后才能下訂單哦!
這篇文章主要講解了“java線程4種常用鎖的特點是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“java線程4種常用鎖的特點是什么”吧!
一. synchronized
1. 介紹
synchronized關鍵字常被Java用于維護數據的一致性。通過synchronized給共享資源上鎖,只有拿到鎖才可以訪問共享資源,這樣就可以保證對訪問共享資源的順序。
2. 使用方式
在需要同步的方法,類或者代碼塊中加入該關鍵字即可,這樣就可以保證在同一個時刻最多只有一個線程執行同一個對象的同步代碼,可保證修飾的代碼在執行過程中不會被其他線程干擾。
synchronized (obj) {
//方法
…….
}
3. 特點及使用場景
synchronized修飾的代碼具有原子性和可見性,在需要進程同步的程序中使用的頻率非常高,可以滿足一般的進程同步要求。
4. 性能及注意事項
synchronized實現的機理依賴于軟件層面上的JVM,因此其性能會隨著Java版本的不斷升級而提高;但需要注意的是線程通過synchronized等待鎖時是不能被Thread.interrupt()中斷的,因此程序設計時必須檢查確保合理,否則可能會造成線程死鎖的尷尬境地。
二. ReentrantLock
1. 介紹
ReentrantLock可重入鎖,顧名思義,這個鎖可以被線程多次重復進入進行獲取操作。ReentantLock繼承接口Lock并實現了接口中定義的方法,除了能完成synchronized所能完成的所有工作外,還提供了諸如可響應中斷鎖、可輪詢鎖請求、定時鎖等避免多線程死鎖的方法。
2. 使用方式
ReentrantLock通過方法lock()與unlock()來進行加鎖與解鎖操作,與synchronized會被JVM自動解鎖機制不同,ReentrantLock加鎖后需要手動進行解鎖。為了避免程序出現異常而無法正常解鎖的情況,使用ReentrantLock必須在finally控制塊中進行解鎖操作。通常使用方式如下所示:
Lock lock = new ReentrantLock(); try { lock.lock(); //…進行任務操作5 } finally { lock.unlock(); }
3. 特點及使用場景
ReentantLock繼承接口Lock,而Lock實現的機理依賴于特殊的CPU指定,可以認為不受JVM的約束,并可以通過其他語言平臺來完成底層的實現 ;多在高并發量情況下使用ReentrantLock。
4. 性能
在并發量較小的多線程應用程序中,ReentrantLock與synchronized性能相差無幾,但在高并發量的條件下,synchronized性能會迅速下降幾十倍,而ReentrantLock的性能卻能依然維持一個水準。
三. Semaphore
1.介紹
Semaphore(信號量),用于做限流處理。是一種計數器,用來保護一個或者多個共享資源的訪問。如果線程要訪問一個資源就必須先獲得信號量。如果信號量內部計數器大于0,信號量減1,然后允許共享這個資源;否則,如果信號量的計數器等于0,信號量將會把線程置入休眠直至計數器大于0.當信號量使用完時,必須釋放。
2.使用方式
案例:同時只允許5五個人訪問,超過五個人訪問就需要等待,類似這樣的需求,下面的案例可以看出執行是五個五個的執行,等上一個五個執行完了,才會執行下一個
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class UseSemaphore {
public static void main(String[] args) {
// 線程池
ExecutorService exec = Executors.newCachedThreadPool();
// 只能5個線程同時訪問
final Semaphore semp = new Semaphore(5);
// 模擬20個客戶端訪問
for (int index = 0; index < 20; index++) {
final int NO = index;
Runnable run = new Runnable() {
public void run() {
try {
// 獲取許可
semp.acquire();
System.out.println("Accessing: " + NO);
//模擬實際業務邏輯
Thread.sleep((long) (Math.random() * 10000));
// 訪問完后,釋放
semp.release();
} catch (InterruptedException e) {
}
}
};
exec.execute(run);
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
//System.out.println(semp.getQueueLength());
// 退出線程池
exec.shutdown();
}
}
3. 特點及使用場景
在多線程環境下使用的一種設施, 它負責協調各個線程, 以保證它們能夠正確、合理的使用公共資源。使用場景如在實際復雜的多線程應用程序中,可能存在多個臨界資源,這時候我們可以借助Semaphore信號量來完成多個臨界資源的訪問。
四. AtomicInteger
1.介紹
AtomicInteger一種無鎖的線程安全整數,一個提供原子操作的Integer的類。在Java語言中,++i和i++操作并不是線程安全的,在使用的時候,不可避免的會用到synchronized關鍵字。而AtomicInteger則通過一種線程安全的加減操作接口。(注:AtomicInteger是一系列相同類的代表之一,常見的還有AtomicLong、AtomicLong等,他們的實現原理相同,區別在與運算對象類型的不同)
2.性能
通過相關資料顯示,通常AtomicInteger的性能是ReentantLock的好幾倍。
感謝各位的閱讀,以上就是“java線程4種常用鎖的特點是什么”的內容了,經過本文的學習后,相信大家對java線程4種常用鎖的特點是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。