新聞中心
這篇文章主要講解了“java線程4種常用鎖的特點是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“java線程4種常用鎖的特點是什么”吧!
創(chuàng)新互聯(lián)建站2013年至今,先為平房等服務(wù)建站,平房等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為平房企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
一. synchronized
1. 介紹
synchronized關(guān)鍵字常被Java用于維護數(shù)據(jù)的一致性。通過synchronized給共享資源上鎖,只有拿到鎖才可以訪問共享資源,這樣就可以保證對訪問共享資源的順序。
2. 使用方式
在需要同步的方法,類或者代碼塊中加入該關(guān)鍵字即可,這樣就可以保證在同一個時刻最多只有一個線程執(zhí)行同一個對象的同步代碼,可保證修飾的代碼在執(zhí)行過程中不會被其他線程干擾。
synchronized (obj) {
//方法
…….
}
3. 特點及使用場景
synchronized修飾的代碼具有原子性和可見性,在需要進程同步的程序中使用的頻率非常高,可以滿足一般的進程同步要求。
4. 性能及注意事項
synchronized實現(xiàn)的機理依賴于軟件層面上的JVM,因此其性能會隨著Java版本的不斷升級而提高;但需要注意的是線程通過synchronized等待鎖時是不能被Thread.interrupt()中斷的,因此程序設(shè)計時必須檢查確保合理,否則可能會造成線程死鎖的尷尬境地。
二. ReentrantLock
1. 介紹
ReentrantLock可重入鎖,顧名思義,這個鎖可以被線程多次重復(fù)進入進行獲取操作。ReentantLock繼承接口Lock并實現(xiàn)了接口中定義的方法,除了能完成synchronized所能完成的所有工作外,還提供了諸如可響應(yīng)中斷鎖、可輪詢鎖請求、定時鎖等避免多線程死鎖的方法。
2. 使用方式
ReentrantLock通過方法lock()與unlock()來進行加鎖與解鎖操作,與synchronized會被JVM自動解鎖機制不同,ReentrantLock加鎖后需要手動進行解鎖。為了避免程序出現(xiàn)異常而無法正常解鎖的情況,使用ReentrantLock必須在finally控制塊中進行解鎖操作。通常使用方式如下所示:
Lock lock = new ReentrantLock(); try { lock.lock(); //…進行任務(wù)操作5 } finally { lock.unlock(); }
3. 特點及使用場景
ReentantLock繼承接口Lock,而Lock實現(xiàn)的機理依賴于特殊的CPU指定,可以認為不受JVM的約束,并可以通過其他語言平臺來完成底層的實現(xiàn) ;多在高并發(fā)量情況下使用ReentrantLock。
4. 性能
在并發(fā)量較小的多線程應(yīng)用程序中,ReentrantLock與synchronized性能相差無幾,但在高并發(fā)量的條件下,synchronized性能會迅速下降幾十倍,而ReentrantLock的性能卻能依然維持一個水準(zhǔn)。
三. Semaphore
1.介紹
Semaphore(信號量),用于做限流處理。是一種計數(shù)器,用來保護一個或者多個共享資源的訪問。如果線程要訪問一個資源就必須先獲得信號量。如果信號量內(nèi)部計數(shù)器大于0,信號量減1,然后允許共享這個資源;否則,如果信號量的計數(shù)器等于0,信號量將會把線程置入休眠直至計數(shù)器大于0.當(dāng)信號量使用完時,必須釋放。
2.使用方式
案例:同時只允許5五個人訪問,超過五個人訪問就需要等待,類似這樣的需求,下面的案例可以看出執(zhí)行是五個五個的執(zhí)行,等上一個五個執(zhí)行完了,才會執(zhí)行下一個
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);
//模擬實際業(yè)務(wù)邏輯
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. 特點及使用場景
在多線程環(huán)境下使用的一種設(shè)施, 它負責(zé)協(xié)調(diào)各個線程, 以保證它們能夠正確、合理的使用公共資源。使用場景如在實際復(fù)雜的多線程應(yīng)用程序中,可能存在多個臨界資源,這時候我們可以借助Semaphore信號量來完成多個臨界資源的訪問。
四. AtomicInteger
1.介紹
AtomicInteger一種無鎖的線程安全整數(shù),一個提供原子操作的Integer的類。在Java語言中,++i和i++操作并不是線程安全的,在使用的時候,不可避免的會用到synchronized關(guān)鍵字。而AtomicInteger則通過一種線程安全的加減操作接口。(注:AtomicInteger是一系列相同類的代表之一,常見的還有AtomicLong、AtomicLong等,他們的實現(xiàn)原理相同,區(qū)別在與運算對象類型的不同)
2.性能
通過相關(guān)資料顯示,通常AtomicInteger的性能是ReentantLock的好幾倍。
感謝各位的閱讀,以上就是“java線程4種常用鎖的特點是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對java線程4種常用鎖的特點是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
新聞名稱:java線程4種常用鎖的特點是什么
本文路徑:http://www.ef60e0e.cn/article/poehcs.html