<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【轉】-java多線程讀寫鎖ReadWriteLock

      Java多線程中讀寫鎖ReadWriteLock的使用

      該博客轉載自?lavimer??Java多線程中讀寫鎖ReadWriteLock的使用

      1. 概念

      讀寫鎖分為讀鎖和寫鎖,多個讀鎖之間是不需要互斥的(讀操作不會改變數據,如果上了鎖,反而會影響效率),寫鎖和寫鎖之間需要互斥,也就是說,如果只是讀數據,就可以多個線程同時讀,但是如果你要寫數據,就必須互斥,使得同一時刻只有一個線程在操作。

      2. 案例

      2.1 三線程讀數據,三線程寫數據

      package com.tao.leanrn.thread.lock;
      
      import java.util.concurrent.locks.ReadWriteLock;
      import java.util.concurrent.locks.ReentrantReadWriteLock;
      
      /**
       * @ClassName ReadWrite
       * @Descriiption 讀寫鎖
       * @Author yanjiantao
       * @Date 2019/8/21 10:42
       **/
      public class ReadWrite {
      
          /**
           * 共享數據
           */
          private int data = 0;
      
          /**
           * 讀寫鎖
           */
          private ReadWriteLock lock = new ReentrantReadWriteLock();
      
          public void get() {
      
              // 上讀鎖
              lock.readLock().lock();
      
              try {
                  System.out.println(Thread.currentThread().getName() + "----->讀鎖開始執行...");
                  Thread.sleep((long)(Math.random() * 10));
                  System.out.println(Thread.currentThread().getName() + "----->讀鎖得到數據data=" + data);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              } finally {
                  // 釋放鎖
                  lock.readLock().unlock();
              }
          }
      
          public void set() {
      
              // 上寫鎖
              lock.writeLock().lock();
      
              try {
                  System.out.println(Thread.currentThread().getName() + "----->寫鎖開始執行...");
                  Thread.sleep((long)(Math.random() * 10));
                  data++;
                  System.out.println(Thread.currentThread().getName() + "----->寫鎖得到數據data=" + data);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              } finally {
                  // 釋放寫鎖
                  lock.writeLock().unlock();
              }
      
          }
      }
      
      /**
       * 測試類
       */
      class Main{
      
          public static void main(String[] args) {
              ReadWrite readWrite = new ReadWrite();
              // 創建100個讀寫線程
              for (int i = 0; i < 100; i++) {
                  new Thread(() -> {
                      readWrite.get();
                  }).start();
      
                  new Thread(() -> {
                      readWrite.set();
                  }).start();
              }
          }
      
      }
      
      

      程序運行結果

      1706261828185.png

      2.2 模擬Hibernate緩存

      public class HibernateCache {
       
      	/* 定義一個Map來模擬緩存 */
      	private Map<String, Object> cache = new HashMap<String, Object>();
       
      	/* 創建一個讀寫鎖 */
      	private ReadWriteLock rwLock = new ReentrantReadWriteLock();
       
      	/**
      	 * 模擬Hibernate緩存
      	 * @param key
      	 * @return
      	 */
      	private Object getData(String key) {
       
      		/* 上讀鎖 */
      		rwLock.readLock().lock();
      		/* 定義從緩存中讀取的對象 */
      		Object value = null;
       
      		try {
      			/* 從緩存中讀取數據 */
      			value = cache.get(key);
       
      			if (value == null) {
      				/* 如果緩存中沒有數據,我們就把讀鎖關閉,直接上寫鎖【讓一個線程去數據庫中取數據】 */
      				rwLock.readLock().unlock();
      				/* 上寫鎖 */
      				rwLock.writeLock().lock();
       
      				try {
      					/* 上了寫鎖之后再判斷一次【我們只讓一個線程去數據庫中取值即可,當第二個線程過來的時候,發現value不為空了就去緩存中取值】 */
      					if (value == null) {
      						/* 模擬去數據庫中取值 */
      						value = "hello";
      					}
      				} finally {
      					/* 寫完之后把寫鎖關閉 */
      					rwLock.writeLock().unlock();
      				}
      				/* 緩存中已經有了數據,我們再把已經 關閉的讀鎖打開 */
      				rwLock.readLock().lock();
      			}
      		} finally {
      			/* 最后把讀鎖也關閉 */
      			rwLock.readLock().unlock();
      		}
      		
      		return value;
      	}
       
      }
      
      posted @ 2024-07-10 09:37  booleandev  閱讀(29)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 日韩av一区二区高清不卡| 精品无码国产一区二区三区AV| 丝袜美腿一区二区三区| 日韩一区二区三区日韩精品| 久久ww精品w免费人成| 国产精品蜜臀av在线一区| 国产中文字幕精品免费| 一区二区三区精品视频免费播放| 日韩深夜福利视频在线观看| 性饥渴少妇AV无码毛片| 久久亚洲国产品一区二区| 国产系列丝袜熟女精品视频| 老司机性色福利精品视频| 国产在线视频一区二区三区| 日韩成av在线免费观看| 99中文字幕精品国产| 成人无码潮喷在线观看| 国产午夜福利不卡在线观看| 四虎永久在线精品无码视频| 狠狠色丁香婷婷综合尤物| 比如县| 九九热精品在线免费视频| 中文日产幕无线码一区中文 | 视频二区中文字幕在线| 免费观看全黄做爰大片| 国产精品欧美一区二区三区不卡| xxxxbbbb欧美残疾人| 农村欧美丰满熟妇xxxx| 精品激情视频一区二区三区| 国产久免费热视频在线观看| 国产av丝袜熟女一二三| 色先锋av影音先锋在线| 亚洲最大天堂在线看视频| 精品日韩亚洲AV无码| 神木县| 摸丰满大乳奶水www免费| 国产丰满乱子伦无码专区| 人妻无码∧V一区二区| 国产成人精品无码播放| 亚洲电影在线观看| 亲子乱aⅴ一区二区三区|