最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java并發(fā)編程之重入鎖與讀寫鎖

 更新時(shí)間:2017年09月25日 15:19:29   作者:麥田  
這篇文章主要介紹了Java并發(fā)編程之重入鎖與讀寫鎖,文中相關(guān)實(shí)例代碼詳細(xì),測(cè)試可用,具有一定參考價(jià)值,需要的朋友可以了解下。

重入鎖

重入鎖,顧名思義,就是支持重進(jìn)入的鎖,它表示該鎖能夠支持一個(gè)線程對(duì)資源的重復(fù)加鎖。重進(jìn)入是指任意線程在獲取到鎖之后能夠再次獲取該鎖而不會(huì)被鎖阻塞,該特性的實(shí)現(xiàn)需要解決以下兩個(gè)問(wèn)題。

1、線程再次獲取鎖。鎖需要去識(shí)別獲取鎖的線程是否為當(dāng)前占據(jù)鎖的線程,如果是,則再次成功獲取。

2、鎖的最終釋放。線程重復(fù)n次獲取了鎖,隨后在第n次釋放該鎖后,其他線程能夠獲取到該鎖。鎖的最終釋放要求鎖對(duì)于獲取進(jìn)行計(jì)數(shù)自增,計(jì)數(shù)表示當(dāng)前鎖被重復(fù)獲取的次數(shù),而鎖被釋放時(shí),計(jì)數(shù)自減,當(dāng)計(jì)數(shù)等于0時(shí)表示鎖已經(jīng)成功釋放。

Java里面內(nèi)置鎖(synchronize)和Lock(ReentrantLock)都是可重入的

synchronized 實(shí)例

package com.home;
public class SynchronizedTest implements Runnable {
  public synchronized void method1() {
    System.out.println("method1獲得鎖,正常運(yùn)行!");
    method2();
  }
  public synchronized void method2() {
    System.out.println("method2獲得鎖,也正常運(yùn)行!");
  }
  @Override
  public void run() {
    method1();
  }
  public static void main(String[] args) {
    SynchronizedTest st = new SynchronizedTest();
    new Thread(st).start();
    new Thread(st).start();
  }
}

Lock 實(shí)例

package com.home;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LockTest implements Runnable {
  Lock lock = new ReentrantLock();
  public void method1() {
    lock.lock();
    System.out.println("method1獲得鎖,正常運(yùn)行!");
    method2();
    lock.unlock();
  }
  public void method2() {
    lock.lock();
    System.out.println("method2獲得鎖,也正常運(yùn)行!");
    lock.unlock();
  }
  @Override
  public void run() {
    method1();
  }
  public static void main(String[] args) {
    LockTest lt = new LockTest();
    new Thread(lt).start();
    new Thread(lt).start();
  }
}

兩個(gè)例子最后的結(jié)果都是正確的,結(jié)果如下:

method1獲得鎖,正常運(yùn)行!
method2獲得鎖,也正常運(yùn)行!
method1獲得鎖,正常運(yùn)行!
method2獲得鎖,也正常運(yùn)行!

可重入鎖最大的作用是避免死鎖

讀寫鎖

讀寫鎖維護(hù)了一對(duì)相關(guān)的鎖,一個(gè)用于只讀操作,一個(gè)用于寫入操作。只要沒有writer,讀取鎖可以由多個(gè)reader線程同時(shí)保持。寫入鎖是獨(dú)占的。

可重入讀寫鎖 ReentrantReadWriteLock

ReentrantReadWriteLock對(duì)象提供了readLock()和writeLock()方法, 用于獲取讀取鎖和寫入鎖.

讀取鎖允許多個(gè)reader線程同時(shí)持有, 而寫入鎖最多只能有一個(gè)writter線程持有.

讀寫鎖的使用場(chǎng)合: 讀取共享數(shù)據(jù)的頻率遠(yuǎn)大于修改共享數(shù)據(jù)的頻率. 在上述場(chǎng)合下, 使用讀寫鎖控制共享資源的訪問(wèn), 可以提高并發(fā)性能.

如果一個(gè)線程已經(jīng)持有了寫入鎖, 則可以再持有讀寫鎖. 相反, 如果一個(gè)線程已經(jīng)持有了讀取鎖, 則在釋放該讀取鎖之前, 不能再持有寫入鎖.

可以調(diào)用寫入鎖的newCondition()方法獲取與該寫入鎖綁定的Condition對(duì)象, 此時(shí)與普通的互斥鎖并沒有什么區(qū)別. 但是調(diào)用讀取鎖的newCondition()方法將拋出異常.

例子

package com.home;
import java.util.Random;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
class ReadWrte {
  // 共享數(shù)據(jù),可以多個(gè)線程讀數(shù)據(jù),只能有一個(gè)線程寫數(shù)據(jù)
  private int data;
  // 創(chuàng)建讀寫鎖
  ReadWriteLock rwLock = new ReentrantReadWriteLock();
  /**
   * 讀數(shù)據(jù),上讀鎖
   */
  public void get() {
    // 讀鎖
    rwLock.readLock().lock();
    try {
      System.out.println(Thread.currentThread().getName() + ",Read!");
      Thread.sleep((long) Math.random() * 1000);
      System.out.println(Thread.currentThread().getName() + " 讀出的數(shù)據(jù)為:" +
        this.getData());
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      rwLock.readLock().unlock();
    }
  }
  /**
   * 寫數(shù)據(jù),上寫鎖
   *
   * @param data
   */
  public void put(int data) {
    // 寫鎖
    rwLock.writeLock().lock();
    try {
      System.out.println(Thread.currentThread().getName() + ",Write!");
      Thread.sleep((long) Math.random() * 1000);
      this.setData(data);
      System.out.println(Thread.currentThread().getName() + " 寫入的數(shù)據(jù)為:" +
        this.getData());
    } catch (InterruptedException e) {
      e.printStackTrace();
    } finally {
      rwLock.writeLock().unlock();
    }
  }
  public int getData() {
    return data;
  }
  public void setData(int data) {
    this.data = data;
  }
}
/**
 * 測(cè)試類
 *
 * @author itmyhome
 *
 */
public class ReadWriteLockTest {
  /**
   * @param args
   */
  public static void main(String[] args) {
    // 創(chuàng)建ReadWrte對(duì)象
    final ReadWrte rw = new ReadWrte();
    for (int i = 0; i < 10; i++) {
      // 創(chuàng)建并啟動(dòng)10個(gè)讀線程
      new Thread(new Runnable() {
          @Override
          public void run() {
            rw.get();
          }
        }).start();
      // 創(chuàng)建并啟動(dòng)10個(gè)寫線程
      new Thread(new Runnable() {
          @Override
          public void run() {
            // 寫入一個(gè)隨機(jī)數(shù)
            rw.put(new Random().nextInt(8));
          }
        }).start();
    }
  }
}

輸出為

Thread-0,Read!
Thread-4,Read!
Thread-8,Read!
Thread-12,Read!
Thread-0 讀出的數(shù)據(jù)為:0
Thread-4 讀出的數(shù)據(jù)為:0
Thread-8 讀出的數(shù)據(jù)為:0
Thread-12 讀出的數(shù)據(jù)為:0
Thread-19,Write!
Thread-19 寫入的數(shù)據(jù)為:5
Thread-7,Write!
Thread-7 寫入的數(shù)據(jù)為:7
Thread-3,Write!
Thread-3 寫入的數(shù)據(jù)為:4
Thread-16,Read!
Thread-16 讀出的數(shù)據(jù)為:4
Thread-11,Write!
Thread-11 寫入的數(shù)據(jù)為:0
Thread-15,Write!
Thread-15 寫入的數(shù)據(jù)為:5
Thread-2,Read!
Thread-2 讀出的數(shù)據(jù)為:5
Thread-17,Write!
Thread-17 寫入的數(shù)據(jù)為:2
Thread-6,Read!
Thread-6 讀出的數(shù)據(jù)為:2
Thread-1,Write!
Thread-1 寫入的數(shù)據(jù)為:5
Thread-13,Write!
Thread-13 寫入的數(shù)據(jù)為:4
Thread-9,Write!
Thread-9 寫入的數(shù)據(jù)為:7
Thread-5,Write!
Thread-5 寫入的數(shù)據(jù)為:2
Thread-10,Read!
Thread-10 讀出的數(shù)據(jù)為:2
Thread-18,Read!
Thread-14,Read!
Thread-18 讀出的數(shù)據(jù)為:2
Thread-14 讀出的數(shù)據(jù)為:2

從圖中我們可以看出,可以多個(gè)線程同時(shí)讀,但只能一個(gè)線程寫,即寫數(shù)據(jù)和寫入數(shù)據(jù)一并完成。

總結(jié)

以上就是本文關(guān)于Java并發(fā)編程之重入鎖與讀寫鎖的全部?jī)?nèi)容,希望對(duì)大家有所幫助。歡迎各位參閱本站其他專題,有什么問(wèn)題可以隨時(shí)留言,小編會(huì)及時(shí)回復(fù)大家的。感謝大家對(duì)本站的支持。

相關(guān)文章

  • Springboot 中使用 Aop代碼實(shí)戰(zhàn)教程

    Springboot 中使用 Aop代碼實(shí)戰(zhàn)教程

    AOP的編程思想是把對(duì)類對(duì)象的橫切問(wèn)題點(diǎn),從業(yè)務(wù)邏輯中分離出來(lái),從而達(dá)到解耦的目的,增加代碼的復(fù)用性,提高開發(fā)效率,這篇文章主要介紹了Springboot中使用Aop代碼實(shí)戰(zhàn)教程,需要的朋友可以參考下
    2023-07-07
  • java判斷Long類型的方法和實(shí)例代碼

    java判斷Long類型的方法和實(shí)例代碼

    在本篇文章里小編給大家整理的是關(guān)于java判斷Long類型的方法和實(shí)例代碼,對(duì)此有需要的朋友們跟著學(xué)習(xí)參考下。
    2020-02-02
  • springcloud + mybatis + seate集成示例

    springcloud + mybatis + seate集成示例

    本文主要介紹了springcloud + mybatis + seate集成示例,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • Java中的MultipartFile接口和File類解讀

    Java中的MultipartFile接口和File類解讀

    本文主要介紹了Java中的File類和Spring框架中的MultipartFile接口,File類提供了對(duì)文件和目錄操作的方法,如創(chuàng)建、刪除、重命名、判斷文件是否存在等,MultipartFile接口用于處理文件上傳,提供了獲取上傳文件信息和保存上傳文件的方法
    2025-02-02
  • Java中SSM+Shiro系統(tǒng)登錄驗(yàn)證碼的實(shí)現(xiàn)方法

    Java中SSM+Shiro系統(tǒng)登錄驗(yàn)證碼的實(shí)現(xiàn)方法

    這篇文章主要介紹了 SSM+Shiro系統(tǒng)登錄驗(yàn)證碼的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-02-02
  • springboot 自定義權(quán)限標(biāo)簽(tld),在freemarker引用操作

    springboot 自定義權(quán)限標(biāo)簽(tld),在freemarker引用操作

    這篇文章主要介紹了springboot 自定義權(quán)限標(biāo)簽(tld),在freemarker引用操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • Java單例模式下的MongoDB數(shù)據(jù)庫(kù)操作工具類

    Java單例模式下的MongoDB數(shù)據(jù)庫(kù)操作工具類

    這篇文章主要介紹了Java單例模式下的MongoDB數(shù)據(jù)庫(kù)操作工具類,結(jié)合實(shí)例形式分析了java基于單例模式下操作MongoDB數(shù)據(jù)庫(kù)相關(guān)連接、查詢、插入、刪除等操作封裝技巧,需要的朋友可以參考下
    2018-01-01
  • Spring-Smart-DI 動(dòng)態(tài)切換實(shí)現(xiàn)類的步驟

    Spring-Smart-DI 動(dòng)態(tài)切換實(shí)現(xiàn)類的步驟

    文章介紹了如何使用spring-smart-di的@AutowiredProxySPI注解來(lái)實(shí)現(xiàn)動(dòng)態(tài)切換服務(wù)提供商的功能,通過(guò)配置點(diǎn)和代理對(duì)象,實(shí)現(xiàn)動(dòng)態(tài)切換而無(wú)需重啟服務(wù),感興趣的朋友一起看看吧
    2025-03-03
  • mybatis整合ehcache做三級(jí)緩存的實(shí)現(xiàn)方法

    mybatis整合ehcache做三級(jí)緩存的實(shí)現(xiàn)方法

    ehcache是一個(gè)快速內(nèi)存緩存框架,java項(xiàng)目里用起來(lái)很方便,下面這篇文章主要給大家介紹了關(guān)于mybatis整合ehcache做三級(jí)緩存的實(shí)現(xiàn)方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • Java Calendar類使用總結(jié)及使用實(shí)例

    Java Calendar類使用總結(jié)及使用實(shí)例

    這篇文章主要介紹了Java Calendar類使用總結(jié)及使用實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03

最新評(píng)論

镇平县| 耒阳市| 都安| 项城市| 亚东县| 湖南省| 玛多县| 区。| 罗江县| 潢川县| 沙河市| 航空| 青铜峡市| 秦皇岛市| 疏勒县| 南召县| 安平县| 凤庆县| 厦门市| 喀什市| 淮安市| 冕宁县| 沭阳县| 靖西县| 醴陵市| 呈贡县| 鄂伦春自治旗| 酒泉市| 普陀区| 板桥市| 交城县| 嘉鱼县| 安康市| 黄浦区| 南澳县| 镇巴县| 秀山| 山西省| 淮北市| 荥经县| 自治县|