久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

千鋒教育-做有情懷、有良心、有品質的職業(yè)教育機構

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  行業(yè)資訊  > Java開發(fā)面試題:如何保證同一資源被多個線程并發(fā)訪問時的完整性?

Java開發(fā)面試題:如何保證同一資源被多個線程并發(fā)訪問時的完整性?

來源:千鋒教育
發(fā)布人:千鋒老師
時間: 2019-02-25 14:55:00 1551077700

  常用的同步方法是采用信號或加鎖機制,確保資源在任意時刻至多被一個線程訪問。Java語言在多線程編程上實現(xiàn)了完全對象化,提供了對同步機制的良好支持。

  在Java中一共有四種方法支持同步,其中前三個是同步方法,一個是管道方法。管道方法不建議使用,阻塞隊列方法在問題4已有描述,現(xiàn)只提供前兩種實現(xiàn)方法。

  - wait()/notify()方法

  - await()/signal()方法

  - BlockingQueue阻塞隊列方法

  - PipedInputStream/PipedOutputStream

  一、生產者類:

  ```

  public class Producer extends Thread { // 每次生產的產品數量

  private int num;

  // 所在放置的倉庫

  private Storage storage;

  // 構造函數,設置倉庫

  public Producer(Storage storage) {

  this.storage = storage;

  }

  // 線程run函數

  public void run() {

  produce(num);

  }

  // 調用倉庫Storage的生產函數

  public void produce(int num) {

  storage.produce(num);

  }

  public int getNum() {

  return num;

  }

  public void setNum(int num) {

  this.num = num;

  }

  public Storage getStorage() {

  return storage;

  }

  public void setStorage(Storage storage) {

  this.storage = storage;

  }

  }

  ```

  二、消費者類:

  ```

  public class Consumer extends Thread { // 每次消費的產品數量

  private int num;

  // 所在放置的倉庫

  private Storage storage;

  // 構造函數,設置倉庫

  public Consumer(Storage storage) {

  this.storage = storage;

  }

  // 線程run函數

  public void run() {

  consume(num);

  }

  // 調用倉庫Storage的生產函數

  public void consume(int num) {

  storage.consume(num);

  }

  // get/set方法

  public int getNum() {

  return num;

  }

  public void setNum(int num) {

  this.num = num;

  }

  public Storage getStorage() {

  return storage;

  }

  public void setStorage(Storage storage) {

  this.storage = storage;

  }

  }

  ```

  倉庫類:(wait()/notify()方法)

  ```

  public class Storage { // 倉庫最大存儲量

  private final int MAX_SIZE = 100;

  // 倉庫存儲的載體

  private LinkedList list = new LinkedList();

  // 生產num個產品

  public void produce(int num) {

  // 同步代碼段

  synchronized (list) {

  // 如果倉庫剩余容量不足

  while (list.size() + num > MAX_SIZE) {

  System.out.print("【要生產的產品數量】:" + num);

  System.out.println(" 【庫存量】:" + list.size() + " 暫時不能執(zhí)行生產任務!");

  try {

  list.wait();// 由于條件不滿足,生產阻塞

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  }

  // 生產條件滿足情況下,生產num個產品

  for (int i = 1; i <= num; ++i) {

  list.add(new Object());

  }

  System.out.print("【已經生產產品數】:" + num);

  System.out.println(" 【現(xiàn)倉儲量為】:" + list.size());

  list.notifyAll();

  }

  }

  // 消費num個產品

  public void consume(int num) {

  // 同步代碼段

  synchronized (list) {

  // 如果倉庫存儲量不足

  while (list.size() < num) {

  System.out.print("【要消費的產品數量】:" + num);

  System.out.println(" 【庫存量】:" + list.size() + " 暫時不能執(zhí)行生產任務!");

  try {

  // 由于條件不滿足,消費阻塞

  list.wait();

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  }

  // 消費條件滿足情況下,消費num個產品

  for (int i = 1; i <= num; ++i) {

  list.remove();

  }

  System.out.print("【已經消費產品數】:" + num);

  System.out.println(" 【現(xiàn)倉儲)量為】:" + list.size());

  list.notifyAll();

  }

  }

  // get/set方法

  public LinkedList getList() {

  return list;

  }

  public void setList(LinkedList list) {

  this.list = list;

  }

  public int getMAX_SIZE() {

  return MAX_SIZE;

  }

  }

  ```

  倉庫類:(await()/signal()方法)

  ```

  public class Storage { // 倉庫最大存儲量

  // 倉庫最大存儲量

  private final int MAX_SIZE = 100;

  // 倉庫存儲的載體

  private LinkedList list = new LinkedList();

  // 鎖

  private final Lock lock = new ReentrantLock();

  // 倉庫滿的條件變量

  private final Condition full = lock.newCondition();

  // 倉庫空的條件變量

  private final Condition empty = lock.newCondition();

  // 生產num個產品

  public void produce(int num) {

  // 獲得鎖

  lock.lock();

  // 如果倉庫剩余容量不足

  while (list.size() + num > MAX_SIZE) {

  System.out.print("【要生產的產品數量】:" + num);

  System.out.println(" 【庫存量】:" + list.size() + " 暫時不能執(zhí)行生產任務!");

  try {

  // 由于條件不滿足,生產阻塞

  full.await();

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  }

  // 生產條件滿足情況下,生產num個產品

  for (int i = 1; i <= num; ++i) {

  list.add(new Object());

  }

  System.out.print("【已經生產產品數】:" + num);

  System.out.println(" 【現(xiàn)倉儲量為】:" + list.size());

  // 喚醒其他所有線程

  full.signalAll();

  empty.signalAll();

  // 釋放鎖

  lock.unlock();

  }

  // 消費num個產品

  public void consume(int num) {

  // 獲得鎖

  lock.lock();

  // 如果倉庫存儲量不足

  while (list.size() < num) {

  System.out.print("【要消費的產品數量】:" + num);

  System.out.println(" 【庫存量】:" + list.size() + " 暫時不能執(zhí)行生產任務!");

  try {

  // 由于條件不滿足,消費阻塞

  empty.await();

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  }

  // 消費條件滿足情況下,消費num個產品

  for (int i = 1; i <= num; ++i) {

  list.remove();

  }

  System.out.print("【已經消費產品數】:" + num);

  System.out.println(" 【現(xiàn)倉儲)量為】:" + list.size());

  // 喚醒其他所有線程

  full.signalAll();

  empty.signalAll();

  // 釋放鎖

  lock.unlock();

  }

  // set/get方法

  public int getMAX_SIZE() {

  return MAX_SIZE;

  }

  public LinkedList getList() {

  return list;

  }

  public void setList(LinkedList list) {

  this.list = list;

  }

  }

 

tags:
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業(yè)內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
PMP?認證榮獲北京市境外職業(yè)資格認可!

北京市人力資源和社會保障局、北京市人才工作局近日發(fā)布了關于印發(fā)《北京市境外職業(yè)資格認可目錄(3.0版)》的通知,新版目錄境外職業(yè)資格清單...詳情>>

2023-09-07 17:27:00
怎么選擇靠譜的短視頻運營培訓機構?

怎么選擇靠譜的短視頻運營培訓機構?5G時代的來臨,短視頻作為新媒體中最為主流的內容更加方便用戶瀏覽觀看信息,因此抖音、快手這類的短視頻平...詳情>>

2023-09-07 15:05:06
全媒體短視頻運營好就業(yè)么?

全媒體短視頻運營好就業(yè)么?現(xiàn)在學習互聯(lián)網運營可不能只會單個的運營技術,企業(yè)更喜歡全能型人才。如今的互聯(lián)網世界有多種平臺,新媒體、短視頻...詳情>>

2023-09-07 14:49:25
短視頻運營培訓機構有用嗎?

短視頻運營培訓機構有用嗎?短視頻的火熱,催生了一大批的網絡紅人、網紅賬號,這些短視頻賬號通過實現(xiàn)粉絲流量變現(xiàn),獲得了非常豐厚的收入,自...詳情>>

2023-09-06 13:49:12
大數據分析就業(yè)高薪崗位介紹

大數據分析就業(yè)高薪崗位介紹?大數據行業(yè)是一個快速發(fā)展的行業(yè),其主要特征是數據規(guī)模龐大、種類多樣、處理復雜。目前,大數據行業(yè)已經成為全球...詳情>>

2023-09-06 13:42:47
開班信息
北京校區(qū)
  • 北京校區(qū)
  • 大連校區(qū)
  • 廣州校區(qū)
  • 成都校區(qū)
  • 杭州校區(qū)
  • 長沙校區(qū)
  • 合肥校區(qū)
  • 南京校區(qū)
  • 上海校區(qū)
  • 深圳校區(qū)
  • 武漢校區(qū)
  • 鄭州校區(qū)
  • 西安校區(qū)
  • 青島校區(qū)
  • 重慶校區(qū)
  • 太原校區(qū)
  • 沈陽校區(qū)
  • 南昌校區(qū)
  • 哈爾濱校區(qū)