java锁_Java锁
java鎖
鎖是一種線程同步機制,例如同步塊。 鎖是使用同步塊在內部實現的。 因此,我們可以在Java中使用鎖代替同步關鍵字。 鎖比同步塊更靈活,更復雜。
從Java 5版本開始,JDK提供了幾種鎖實現,例如ReentrantReadWriteLock,ReentrantLock和StampedLock等。
1.同步和鎖之間的區別
1)我們可以設置一個超時來使用Lock.tryLock(long timeout,TimeUnit timeUnit)方法訪問資源,而同步是不可能的。
2)同步塊必須完全包含在一個進程中。 鎖可以包含在兩個單獨的進程中:lock()和unlock()。
3)處于“等待”狀態以獲取對同步塊的訪問權限的線程不能被中斷。 Lock API提供了方法lockInterruptible(),該方法可在線程等待Lock時中斷線程。
2.實現簡單鎖:
使用synced關鍵字可以實現簡單的增量功能。
public class Counter {private int number = 0;public void increment() {synchronized(number) {return ++number;}} }讓我們使用Lock接口轉換上述程序。
public class Counter {private int number = 0;private Lock lock = new Lock();public void increment() { lock.lock();int newNumber = ++number;lock.unlock();return new number;} }在這里,我們使用的是鎖接口,而不是synced關鍵字。
在增加數字之前,我們必須先鎖定,以便其他任何人都不能在該塊中輸入任何內容,直到鎖定增加并釋放為止。
3.改進代碼的方法
假設有些線程正在讀取數據,有些線程正在向某些資源寫入日期。 對于讀取線程,如果一個線程正在從資源中讀取數據,如果另一個線程也在從資源中讀取數據,則不會造成任何問題,但是如果一個線程正在向資源中寫入數據,則另一個線程也正在向資源中寫入數據,則會引起問題。
- 對于讀取操作,可以允許多個線程從資源讀取數據,但不允許寫入線程。
- 如果請求一個線程進行讀取訪問,而請求一個線程進行寫入訪問,那么優先級是什么,哪個線程可以訪問資源?
- 如果請求一個線程進行讀取訪問,則請求第二個線程進行寫入訪問,如果請求讀取訪問的線程更多,則如果我們僅允許讀取請求的線程,則寫入線程將需要等待不確定的時間,這導致饑餓。
- 為了避免出現這種情況,Java在讀取訪問和寫入訪問時設置了一些規則。
3.1 ReadWriteLock
ReadWriteLock是Java 5版本中Java提供的實現; 它有兩種方法,分別是Lock()和write-lock()。
Read Lock方法用于讀取操作,而write-lock()方法用于寫入操作。
3.2鎖入
Java中的同步塊是可重入的。 如果Java線程輸入了同步的代碼塊,請在同步塊的監視器對象上使用Lock。 然后,線程可以輸入在同一監視對象上同步的其他Java代碼塊。
4.讓我們考慮以下情形:
線程1和線程2都將被阻塞,從而導致死鎖情況。
為了使鎖重入,Java提供了另一種鎖實現。
在使用重入鎖定時,我們需要了解一些用例,例如,
在同一對象上,在某些方法中,線程可能會請求讀取訪問權限;在同一對象上,可能是線程在不同方法中,可能會請求寫訪問權限,反之亦然。
4.1閱讀重入:
如果線程可以獲取讀訪問權限(無寫訪問權限和寫請求),或者該線程已經具有讀訪問權限,則該線程將被授予重入權限。 (無論是否有書面要求)。
4.2寫重入:
僅當他們必須具有寫訪問權限時,才授予寫重入權限。
4.3讀寫入口:
有時,線程必須同時讀取和寫入訪問權限。 為此,線程必須是唯一的讀取器。
4.4寫讀入口:
有時,必須具有寫訪問權的線程也需要讀訪問權。 如果有要求,應始終授予寫者讀訪問權限。 如果該線程具有讀取訪問權限,則其他任何線程都不能具有讀取或寫入訪問權限,因此這并不危險。
基于以上概念,讓我們實現ArrayList的同步版本。
ThreadSaftyArrayList.java
public class ThreadSaftyArrayList {private final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();private final Lock writeLock = readWriteLock.writeLock();private final Lock readLock = readWriteLock.readLock();private List list = new ArrayList();public E get(int index){readLock.lock();try { return list.get(index);} finally {readLock.unlock();}}public void set(E e){writeLock.lock();try {list.add(e);} finally {writeLock.unlock();}}public static void main(String[] args){ThreadSaftyArrayList threadSafeArrayList = new ThreadSaftyArrayList();threadSafeArrayList.set("1");threadSafeArrayList.set("2");threadSafeArrayList.set("3");System.out.println("Printing the First Element : "+threadSafeArrayList.get(1));} }注意:從最后一個子句中調用解鎖():
當使用ReadWriteLock保護關鍵部分并且關鍵部分可能會引發異常時,從finally子句內部調用readUnlock()和writeUnlock()方法很重要。 這樣做可以確保ReadWriteLock已解鎖,以便其他線程可以鎖定它。
偽代碼:
lock.lockWrite();try{//do critical section code, which may throw an exception} finally {lock.unlockWrite();}5.結論
在當前的博客中,我們了解了鎖,如何在Java中實現鎖,如何替換了同步塊。 我們還了解了不同類型的鎖,例如讀取鎖和寫入鎖。 我們了解了Starvation(何時發生)以及Reentrance鎖,它的用途以及Java中提供的實現類。 最后,我們使用ReentrantReadWriteLock類編寫了示例ThreadSafty Arraylist類。 希望以上教程對Java開發人員和社區有所幫助。
6.下載Java中的鎖
這是Java中的鎖的示例。
下載您可以在此處下載此示例的完整源代碼: Java中的Locks
翻譯自: https://www.javacodegeeks.com/locks-in-java.html
java鎖
總結
以上是生活随笔為你收集整理的java锁_Java锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 罗技鼠标驱动ghub设置教程 罗技ghu
- 下一篇: java联接pg库_成为Java流大师–