日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java锁_Java锁

發布時間:2023/12/3 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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.讓我們考慮以下情形:

  • Thread1正在獲得讀取訪問權限。
  • Thread2正在請求寫訪問權限; 由于只有一個閱讀器,因此它將被阻止。
  • 線程1再次請求讀取訪問權限,因為有一個寫入請求,它將被阻止。
  • 線程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锁的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。