亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

java多線程并發中使用Lockers類將多線程共享資源鎖定

2019-11-26 15:46:10
字體:
來源:轉載
供稿:網友

復制代碼 代碼如下:

package com.yao;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * Lockers
 * 在多線程編程里面一個重要的概念是鎖定,如果一個資源是多個線程共享的,為了保證數據的完整性,
 * 在進行事務性操作時需要將共享資源鎖定,這樣可以保證在做事務性操作時只有一個線程能對資源進行操作,
 * 從而保證數據的完整性。在5.0以前,鎖定的功能是由Synchronized關鍵字來實現的。
 */
public class Lockers {

 /**
  * 測試Lock的使用。在方法中使用Lock,可以避免使用Synchronized關鍵字。
  */
 public static class LockTest {

  Lock lock = new ReentrantLock();// 鎖
  double value = 0d; // 值
  int addtimes = 0;

  /**
   * 增加value的值,該方法的操作分為2步,而且相互依賴,必須實現在一個事務中
   * 所以該方法必須同步,以前的做法是在方法聲明中使用Synchronized關鍵字。
   */
  public void addValue(double v) {
   lock.lock();// 取得鎖
   System.out.println("LockTest to addValue: " + v + "   "
     + System.currentTimeMillis());
   try {
    Thread.sleep(1000);
   } catch (InterruptedException e) {
   }
   this.value += v;
   this.addtimes++;
   lock.unlock();// 釋放鎖
  }

  public double getValue() {
   return this.value;
  }
 }
 public static void testLockTest() throws Exception{
  final LockTest lockTest = new LockTest();
  // 新建任務1,調用lockTest的addValue方法
  Runnable task1 = new Runnable(){
   public void run(){
    lockTest.addValue(55.55);
   }
  };
  // 新建任務2,調用lockTest的getValue方法
  Runnable task2 = new Runnable(){
   public void run(){
    System.out.println("value: " + lockTest.getValue());
   }
  };
  // 新建任務執行服務
  ExecutorService cachedService = Executors.newCachedThreadPool();
  Future future = null;
  // 同時執行任務1三次,由于addValue方法使用了鎖機制,所以,實質上會順序執行
  for (int i=0; i<3; i++){
   future = cachedService.submit(task1);
  }
  // 等待最后一個任務1被執行完
  future.get();
  // 再執行任務2,輸出結果
  future = cachedService.submit(task2);
  // 等待任務2執行完后,關閉任務執行服務
  future.get();
  cachedService.shutdownNow();
 }

 /**
  * ReadWriteLock內置兩個Lock,一個是讀的Lock,一個是寫的Lock。
  * 多個線程可同時得到讀的Lock,但只有一個線程能得到寫的Lock,
  * 而且寫的Lock被鎖定后,任何線程都不能得到Lock。ReadWriteLock提供的方法有:
  * readLock(): 返回一個讀的lock
  * writeLock(): 返回一個寫的lock, 此lock是排他的。
  * ReadWriteLockTest很適合處理類似文件的讀寫操作。
  * 讀的時候可以同時讀,但不能寫;寫的時候既不能同時寫也不能讀。
  */
 public static class ReadWriteLockTest{
  // 鎖
  ReadWriteLock lock = new ReentrantReadWriteLock();
  // 值
  double value = 0d;
  int addtimes = 0;

  /**
   * 增加value的值,不允許多個線程同時進入該方法
   */
  public void addValue(double v) {
   // 得到writeLock并鎖定
   Lock writeLock = lock.writeLock();
   writeLock.lock();
   System.out.println("ReadWriteLockTest to addValue: " + v + "   "
     + System.currentTimeMillis());
   try {
    Thread.sleep(1000);
   } catch (InterruptedException e) {
   }
   try {
    // 做寫的工作
    this.value += v;
    this.addtimes++;
   } finally {
    // 釋放writeLock鎖
    writeLock.unlock();
   }
  }
  /**
   * 獲得信息。當有線程在調用addValue方法時,getInfo得到的信息可能是不正確的。
   * 所以,也必須保證該方法在被調用時,沒有方法在調用addValue方法。
   */
  public String getInfo() {
   // 得到readLock并鎖定
   Lock readLock = lock.readLock();
   readLock.lock();
   System.out.println("ReadWriteLockTest to getInfo   "
     + System.currentTimeMillis());
   try {
    Thread.sleep(1000);
   } catch (InterruptedException e) {
   }
   try {
    // 做讀的工作
    return this.value + " : " + this.addtimes;
   } finally {
    // 釋放readLock
    readLock.unlock();
   }
  }
 }

 public static void testReadWriteLockTest() throws Exception{
  final ReadWriteLockTest readWriteLockTest = new ReadWriteLockTest();
  // 新建任務1,調用lockTest的addValue方法
  Runnable task_1 = new Runnable(){
   public void run(){
    readWriteLockTest.addValue(55.55);
   }
  };
  // 新建任務2,調用lockTest的getValue方法
  Runnable task_2 = new Runnable(){
   public void run(){
    System.out.println("info: " + readWriteLockTest.getInfo());
   }
  };
  // 新建任務執行服務
  ExecutorService cachedService_1 = Executors.newCachedThreadPool();
  Future future_1 = null;
  // 同時執行5個任務,其中前2個任務是task_1,后兩個任務是task_2
  for (int i=0; i<2; i++){
   future_1 = cachedService_1.submit(task_1);
  }
  for (int i=0; i<2; i++){
   future_1 = cachedService_1.submit(task_2);
  }
  // 最后一個任務是task_1
  future_1 = cachedService_1.submit(task_1);
  // 這5個任務的執行順序應該是:
  // 第一個task_1先執行,第二個task_1再執行;這是因為不能同時寫,所以必須等。
  // 然后2個task_2同時執行;這是因為在寫的時候,就不能讀,所以都等待寫結束,
  // 又因為可以同時讀,所以它們同時執行
  // 最后一個task_1再執行。這是因為在讀的時候,也不能寫,所以必須等待讀結束后,才能寫。

  // 等待最后一個task_2被執行完
  future_1.get();
  cachedService_1.shutdownNow();
 }

 public static void main(String[] args) throws Exception{
  Lockers.testLockTest();
  System.out.println("---------------------");
  Lockers.testReadWriteLockTest();
 }
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区香蕉| 亚洲永久在线观看| 色偷偷91综合久久噜噜| 综合网中文字幕| 一个人看的www久久| 久久成人亚洲精品| 91天堂在线视频| 欧美性黄网官网| 日韩av一区二区在线观看| 国产欧美精品在线播放| 韩国精品久久久999| 综合国产在线视频| 久久久成人av| 91精品国产91久久久久久最新| 欧美极品少妇xxxxⅹ裸体艺术| 欧美在线亚洲一区| 久久最新资源网| 色诱女教师一区二区三区| 亚洲一区二区三区视频播放| 欧美精品情趣视频| 伊人久久综合97精品| 最近2019免费中文字幕视频三| 欧美一级视频在线观看| 国产一区二区三区视频免费| 91超碰中文字幕久久精品| 欧美午夜激情视频| 欧美亚洲在线播放| 神马国产精品影院av| 国产成人免费av电影| 欧美一级淫片播放口| 亚洲第一色在线| 欧美精品情趣视频| 日韩精品在线视频观看| 韩曰欧美视频免费观看| 热久久视久久精品18亚洲精品| 亚洲精品一区av在线播放| 91视频国产高清| 在线电影中文日韩| www日韩欧美| 亚洲无亚洲人成网站77777| 国产日产欧美a一级在线| 国产91在线高潮白浆在线观看| 国产精品九九久久久久久久| 中文字幕亚洲欧美日韩在线不卡| 欧美激情va永久在线播放| 亚洲天堂av电影| 成人精品久久久| 激情成人中文字幕| 欧美区在线播放| 欧美肥老太性生活视频| 欧美自拍视频在线观看| 久久777国产线看观看精品| 亚洲日本aⅴ片在线观看香蕉| 亚洲精品国产美女| 精品国产成人av| 中文字幕欧美视频在线| 国产欧美日韩综合精品| 久久免费观看视频| 国产日韩欧美日韩| 国产丝袜精品第一页| 日韩视频在线一区| 国产精品白丝av嫩草影院| 久久深夜福利免费观看| 97香蕉超级碰碰久久免费的优势| 国产精品成人v| 国产精品久久久久久久久久免费| 亚洲日韩第一页| 亚洲香蕉成人av网站在线观看| 久久久久久久一| 欧美激情2020午夜免费观看| 亚洲偷欧美偷国内偷| 亚洲va国产va天堂va久久| 欧美激情一区二区三区成人| 欧美日韩国产一区二区三区| 国产小视频国产精品| 久久精品免费电影| 久久久国产成人精品| 亚洲专区中文字幕| 欧美性猛交99久久久久99按摩| 亚洲系列中文字幕| 欧美日韩美女在线观看| 日韩欧美精品中文字幕| 久久免费国产视频| 国产精品毛片a∨一区二区三区|国| 国产精品电影网| 欧美激情欧美激情| 欧美高清电影在线看| 久久久久久综合网天天| 亚洲精品国偷自产在线99热| 狠狠色噜噜狠狠狠狠97| 7777kkkk成人观看| 欧美电影免费观看电视剧大全| 欧美电影在线观看| 色www亚洲国产张柏芝| 国产精品久久久久久久一区探花| 欧美日本啪啪无遮挡网站| 欧美性xxxx在线播放| 亚洲第一精品久久忘忧草社区| 日韩午夜在线视频| 欧美性猛交xxxx黑人猛交| 亚洲国产天堂久久国产91| 国产成人a亚洲精品| 色婷婷成人综合| 91免费电影网站| 美女撒尿一区二区三区| 国产小视频91| 北条麻妃久久精品| 国产精品第一视频| 日本精品免费一区二区三区| 97国产精品久久| 九九久久精品一区| 欧美乱妇40p| 韩国精品美女www爽爽爽视频| 国产乱人伦真实精品视频| 国产精品午夜视频| 91在线高清免费观看| 久久99精品国产99久久6尤物| 国产91精品久久久久久久| 欧美大片在线看免费观看| 在线日韩日本国产亚洲| 精品国产一区久久久| 国产精品精品久久久| 欧美电影第一页| 国产精品日韩专区| 亚洲国产精品久久精品怡红院| 亚洲91精品在线观看| 亚洲精品视频在线播放| 国产精品对白刺激| 91老司机在线| 热久久美女精品天天吊色| 日韩av网站在线| 国产美女搞久久| 日韩精品在线观看网站| 欧美日韩美女在线观看| 亚洲欧美制服综合另类| 亚洲欧洲日产国码av系列天堂| 久久久久久久久综合| 亚洲第一页中文字幕| 国产一区红桃视频| 亚洲护士老师的毛茸茸最新章节| 日韩精品黄色网| 日韩高清电影免费观看完整版| 成人精品一区二区三区| 精品一区二区三区四区在线| 亚洲一区二区三区成人在线视频精品| 欧美日本啪啪无遮挡网站| 亚洲欧洲日本专区| 中文字幕日韩精品在线观看| 亚洲精品日韩丝袜精品| 日韩电影在线观看永久视频免费网站| 亚洲激情视频在线| 粉嫩老牛aⅴ一区二区三区| 欧洲亚洲免费视频| 亚洲欧美一区二区三区在线| 亚洲丝袜在线视频| www.日本久久久久com.| 亚洲人成伊人成综合网久久久| 国产剧情日韩欧美| 精品国产一区久久久| 久久久精品一区二区| 精品国产乱码久久久久久婷婷| 久久精品99国产精品酒店日本| 欧美成人免费观看| 欧美成人免费大片|