導航:首頁 > 編程語言 > java鎖

java鎖

發布時間:2022-02-05 13:44:55

㈠ 如何使用java的鎖機制

可以在臨界區代碼開始的位置執行Lock類的lock方法,為代碼塊加鎖,而在臨界區的出口使用相同Lock實例的unlock方法,釋放臨界區資源。
Demo2-12中,主線程先創建了一個lockTest對象test,然後將相同的test對象交給兩個不同的線程執行。子線程1獲取到了lock後,開始執行before sleep輸出語句,遇到sleep後,線程1阻塞將會放棄執行權,這時線程2可以獲取執行權,當線程2執行lock方法時,發現鎖已經被別的線程獲取,所以線程2阻塞等待lock的釋放。線程1從sleep中被喚醒後,將繼續執行after sleep語句,之後釋放了鎖,此時線程2從鎖等待中被喚醒,執行臨近區的內容,因此Demo2-12的輸出是先線程1的兩條語句,之後才輸出線程2的兩條語句。而Demo2-13在沒有鎖的保護下,程序無法保證先將線程1的兩條語句輸出後再執行線程2的輸出,因此,Demo2-13的輸出結果是交叉的。

㈡ JAVA鎖有哪些種類,以及區別

常見的Java鎖有下面這些:

㈢ Java怎樣鎖鍵盤

我們可以查閱api文檔,可以發現在 toolkit 類中呢,有個
setLockingKeyState方法,使用方法如下:
public voidsetLockingKeyState(int keyCode,
boolean on)

設置鍵盤上給定鎖定鍵的狀態。有效鍵代碼是
VK_CAPS_LOCK

VK_NUM_LOCK

VK_SCROLL_LOCK

VK_KANA_LOCK

根據不同的平台,設置鎖定鍵的狀態可能涉及事件處理,因此不能立即通過 getLockingKeyState 觀察到。

拋出:
IllegalArgumentException- 如果keyCode不是有效鍵代碼之一
UnsupportedOperationException- 如果主機系統不允許以編程方式設置此鍵的狀態,或者鍵盤沒有此鍵
HeadlessException- 如果
GraphicsEnvironment.isHeadless() 返回 true

ToolKit.getDefaultToolKit().setLockingKeyState(KeyEvent.VK_NUM_LOCK,false);
這樣我們就鎖定了鍵盤上的數字鍵盤哦,大家還可以試一下
VK_CAPS_LOCK、VK_SCROLL_LOCK和VK_KANA_LOCK

㈣ java中的鎖有哪幾種

lock比synchronized比較如下:

1) 支持公平鎖,某些場景下需要獲得鎖的時間與申請鎖的時間相一致,但是synchronized做不到
2) 支持中斷處理,就是說那些持有鎖的線程一直不釋放,正在等待的線程可以放棄等待。如果不支持中斷處理,那麼線程可能一直無限制的等待下去,就算那些正在佔用資源的線程死鎖了,正在等待的那些資源還是會繼續等待,但是ReentrantLock可以選擇放棄等待
3) condition和lock配合使用,以獲得最大的性能
JAVA中鎖使用的幾點建議:

1.如果沒有特殊的需求,建議使用synchronized,因為操作簡單,便捷,不需要額外進行鎖的釋放。鑒於JDK1.8中的ConcurrentHashMap也使用了CAS+synchronized的方式替換了老版本中使用分段鎖(ReentrantLock)的方式,可以得知,JVM中對synchronized的性能做了比較好的優化。
2.如果代碼中有特殊的需求,建議使用Lock。例如並發量比較高,且有些操作比較耗時,則可以使用支持中斷的所獲取方式;如果對於鎖的獲取,講究先來後到的順序則可以使用公平鎖;另外對於多個變數的鎖保護可以通過lock中提供的condition對象來和lock配合使用,獲取最大的性能。

㈤ Java中有哪些鎖,區別是什麼

【1】公平所和非公平所。
公平鎖:是指按照申請鎖的順序來獲取鎖,
非公平所:線程獲取鎖的順序不一定按照申請鎖的順序來的。

//默認是不公平鎖,傳入true為公平鎖,否則為非公平鎖
ReentrantLock reentrantLock = new ReetrantLock();
1
2
【2】共享鎖和獨享鎖
獨享鎖:一次只能被一個線程所訪問
共享鎖:線程可以被多個線程所持有。
ReadWriteLock 讀鎖是共享鎖,寫鎖是獨享鎖。
【3】樂觀鎖和悲觀鎖。
樂觀鎖:對於一個數據的操作並發,是不會發生修改的。在更新數據的時候,會嘗試採用更新,不斷重入的方式,更新數據。
悲觀鎖:對於同一個數據的並發操作,是一定會發生修改的。因此對於同一個數據的並發操作,悲觀鎖採用加鎖的形式。悲觀鎖認為,不加鎖的操作一定會出問題,
【4】分段鎖
1.7及之前的concurrenthashmap。並發操作就是分段鎖,其思想就是讓鎖的粒度變小。
【5】偏向鎖是指一段同步代碼一直被一個線程所訪問,那麼該線程會自動獲取鎖。降低獲取鎖的代價
輕量級鎖
重量級鎖
【6】自旋鎖
自旋鎖

㈥ java重入鎖有哪些實現

用在只能單線程處理的地方唄,一般來說,如果一個方法被多個線程調用,方法里有修改類變數就需要鎖了,因為在線程運行時,類變數被拷貝到線程專用的緩存,然後再拷貝回程序內存,如果同時有多個線程做上述動作,最後一個線程改變後的值就會覆蓋其他線程做的修改。

㈦ 說說java鎖有哪些種類,以及區別

鎖作為並發共享數據,保證一致性的工具,在JAVA平台有多種實現(如 synchronized 和 ReentrantLock等等 ) 。這些已經寫好提供的鎖為我們開發提供了便利,但是鎖的具體性質以及類型卻很少被提及。本系列文章將分析JAVA下常見的鎖名稱以及特性,為大家答疑解惑。
1、自旋鎖
自旋鎖是採用讓當前線程不停地的在循環體內執行實現的,當循環的條件被其他線程改變時 才能進入臨界區。如下

01 public class SpinLock {
02
03 private AtomicReference<Thread> sign =newAtomicReference<>();
04
05 public void lock(){
06 Thread current = Thread.currentThread();
07 while(!sign .compareAndSet(null, current)){
08 }
09 }
10
11 public void unlock (){
12 Thread current = Thread.currentThread();
13 sign .compareAndSet(current, null);
14 }
15 }
使用了CAS原子操作,lock函數將owner設置為當前線程,並且預測原來的值為空。unlock函數將owner設置為null,並且預測值為當前線程。
當有第二個線程調用lock操作時由於owner值不為空,導致循環一直被執行,直至第一個線程調用unlock函數將owner設置為null,第二個線程才能進入臨界區。
由於自旋鎖只是將當前線程不停地執行循環體,不進行線程狀態的改變,所以響應速度更快。但當線程數不停增加時,性能下降明顯,因為每個線程都需要執行,佔用CPU時間。如果線程競爭不激烈,並且保持鎖的時間段。適合使用自旋鎖。
註:該例子為非公平鎖,獲得鎖的先後順序,不會按照進入lock的先後順序進行。
Java鎖的種類以及辨析(二):自旋鎖的其他種類

鎖作為並發共享數據,保證一致性的工具,在JAVA平台有多種實現(如 synchronized 和 ReentrantLock等等 ) 。這些已經寫好提供的鎖為我們開發提供了便利,但是鎖的具體性質以及類型卻很少被提及。本系列文章將分析JAVA下常見的鎖名稱以及特性,為大家答疑解惑。

2.自旋鎖的其他種類
上篇我們講到了自旋鎖,在自旋鎖中 另有三種常見的鎖形式:TicketLock ,CLHlock 和MCSlock
Ticket鎖主要解決的是訪問順序的問題,主要的問題是在多核cpu上
01 package com.alipay.titan.dcc.dal.entity;
02
03 import java.util.concurrent.atomic.AtomicInteger;
04
05 public class TicketLock {
06 private AtomicInteger serviceNum = new AtomicInteger();
07 private AtomicInteger ticketNum = new AtomicInteger();
08 private static final ThreadLocal<Integer> LOCAL = new ThreadLocal<Integer>();
09
10 public void lock() {
11 int myticket = ticketNum.getAndIncrement();
12 LOCAL.set(myticket);
13 while (myticket != serviceNum.get()) {
14 }
15
16 }
17
18 public void unlock() {
19 int myticket = LOCAL.get();
20 serviceNum.compareAndSet(myticket, myticket + 1);
21 }
22 }
每次都要查詢一個serviceNum 服務號,影響性能(必須要到主內存讀取,並阻止其他cpu修改)。
CLHLock 和MCSLock 則是兩種類型相似的公平鎖,採用鏈表的形式進行排序,
01 importjava.util.concurrent.atomic.AtomicReferenceFieldUpdater;
02
03 public class CLHLock {
04 public static class CLHNode {
05 private volatile boolean isLocked = true;
06 }
07
08 @SuppressWarnings("unused")
09 private volatileCLHNode tail;
10 private static finalThreadLocal<CLHNode> LOCAL = new ThreadLocal<CLHNode>();
11 private static <CLHLock, CLHNode> UPDATER = AtomicReferenceFieldUpdater.newUpdater(CLHLock.class,
12 CLHNode.class,"tail");
13
14 public void lock() {
15 CLHNode node = new CLHNode();
16 LOCAL.set(node);
17 CLHNode preNode = UPDATER.getAndSet(this, node);
18 if (preNode != null) {
19 while (preNode.isLocked) {
20 }
21 preNode = null;
22 LOCAL.set(node);
23 }
24 }
25
26 public void unlock() {
27 CLHNode node = LOCAL.get();
28 if (!UPDATER.compareAndSet(this, node,null)) {
29 node.isLocked = false;
30 }
31 node = null;
32 }
33 }

CLHlock是不停的查詢前驅變數, 導致不適合在NUMA 架構下使用(在這種結構下,每個線程分布在不同的物理內存區域)
MCSLock則是對本地變數的節點進行循環。不存在CLHlock 的問題。
01 importjava.util.concurrent.atomic.AtomicReferenceFieldUpdater;
02
03 public class MCSLock {
04 public static class MCSNode {
05 volatile MCSNode next;
06 volatile boolean isLocked = true;
07 }
08
09 private static finalThreadLocal<MCSNode> NODE = new ThreadLocal<MCSNode>();
10 @SuppressWarnings("unused")
11 private volatileMCSNode queue;
12 private static <MCSLock, MCSNode> UPDATER = AtomicReferenceFieldUpdater.newUpdater(MCSLock.class,
13 MCSNode.class,"queue");
14
15 public void lock() {
16 MCSNode currentNode = new MCSNode();
17 NODE.set(currentNode);
18 MCSNode preNode = UPDATER.getAndSet(this, currentNode);
19 if (preNode != null) {
20 preNode.next = currentNode;
21 while (currentNode.isLocked) {
22
23 }
24 }
25 }
26
27 public void unlock() {
28 MCSNode currentNode = NODE.get();
29 if (currentNode.next == null) {
30 if (UPDATER.compareAndSet(this, currentNode, null)) {
31
32 } else {
33 while (currentNode.next == null) {
34 }
35 }
36 } else {
37 currentNode.next.isLocked = false;
38 currentNode.next = null;
39 }
40 }
41 }

㈧ Java當中有哪幾種鎖

語法層面還是語言層面?

語法層面有synchronized和lock,語言層面的看看這個了解個大概網頁鏈接

㈨ java 鎖的本質是什麼

任何東西都可以是鎖,一把鎖在同一時間只能被一個線程佔用

㈩ java線程鎖有幾種

1、自旋鎖
2、自旋鎖的其他種類
3、阻塞鎖
4、可重入鎖
5、讀寫鎖
6、互斥鎖
7、悲觀鎖
8、樂觀鎖
9、公平鎖
10、非公平鎖
11、偏向鎖
12、對象鎖
13、線程鎖
14、鎖粗化
15、輕量級鎖
16、鎖消除
17、鎖膨脹
18、信號量

閱讀全文

與java鎖相關的資料

熱點內容
linuxboot修復 瀏覽:841
程序在線編譯系統的設計與實現 瀏覽:722
電腦c盤記錄存在哪個文件夾 瀏覽:155
演算法分析與設計替換方法 瀏覽:850
老程序員丟失手機 瀏覽:272
新世紀日本語pdf 瀏覽:85
基於單片機的數字示波器 瀏覽:36
登qq伺服器連接中什麼意思 瀏覽:436
表格宏命令 瀏覽:994
肯德基app設定在哪裡 瀏覽:472
蘋果電腦文件夾怎麼添加列印機 瀏覽:701
pythonswagger 瀏覽:235
作業打卡解壓素材 瀏覽:159
pdf導入ibooks 瀏覽:577
xps文件轉pdf 瀏覽:134
怎麼樣獲得命令方塊 瀏覽:899
安卓studio如何改主題 瀏覽:933
linux自動獲取ip命令行 瀏覽:208
做設計做程序員適合的電腦 瀏覽:778
網站有源碼和沒有源碼的區別 瀏覽:680