国产一区二区精品-国产一区二区精品久-国产一区二区精品久久-国产一区二区精品久久91-免费毛片播放-免费毛片基地

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

手機(jī)站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

千鋒教育

掃一掃進(jìn)入千鋒手機(jī)站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

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

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

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

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

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

  - wait()/notify()方法

  - await()/signal()方法

  - BlockingQueue阻塞隊(duì)列方法

  - PipedInputStream/PipedOutputStream

  一、生產(chǎn)者類:

  ```

  public class Producer extends Thread { // 每次生產(chǎn)的產(chǎn)品數(shù)量

  private int num;

  // 所在放置的倉庫

  private Storage storage;

  // 構(gòu)造函數(shù),設(shè)置倉庫

  public Producer(Storage storage) {

  this.storage = storage;

  }

  // 線程run函數(shù)

  public void run() {

  produce(num);

  }

  // 調(diào)用倉庫Storage的生產(chǎn)函數(shù)

  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;

  }

  }

  ```

  二、消費(fèi)者類:

  ```

  public class Consumer extends Thread { // 每次消費(fèi)的產(chǎn)品數(shù)量

  private int num;

  // 所在放置的倉庫

  private Storage storage;

  // 構(gòu)造函數(shù),設(shè)置倉庫

  public Consumer(Storage storage) {

  this.storage = storage;

  }

  // 線程run函數(shù)

  public void run() {

  consume(num);

  }

  // 調(diào)用倉庫Storage的生產(chǎn)函數(shù)

  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 { // 倉庫最大存儲(chǔ)量

  private final int MAX_SIZE = 100;

  // 倉庫存儲(chǔ)的載體

  private LinkedList list = new LinkedList();

  // 生產(chǎn)num個(gè)產(chǎn)品

  public void produce(int num) {

  // 同步代碼段

  synchronized (list) {

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

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

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

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

  try {

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

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  }

  // 生產(chǎn)條件滿足情況下,生產(chǎn)num個(gè)產(chǎn)品

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

  list.add(new Object());

  }

  System.out.print("【已經(jīng)生產(chǎn)產(chǎn)品數(shù)】:" + num);

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

  list.notifyAll();

  }

  }

  // 消費(fèi)num個(gè)產(chǎn)品

  public void consume(int num) {

  // 同步代碼段

  synchronized (list) {

  // 如果倉庫存儲(chǔ)量不足

  while (list.size() < num) {

  System.out.print("【要消費(fèi)的產(chǎn)品數(shù)量】:" + num);

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

  try {

  // 由于條件不滿足,消費(fèi)阻塞

  list.wait();

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  }

  // 消費(fèi)條件滿足情況下,消費(fèi)num個(gè)產(chǎn)品

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

  list.remove();

  }

  System.out.print("【已經(jīng)消費(fèi)產(chǎn)品數(shù)】:" + num);

  System.out.println(" 【現(xiàn)倉儲(chǔ))量為】:" + 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 { // 倉庫最大存儲(chǔ)量

  // 倉庫最大存儲(chǔ)量

  private final int MAX_SIZE = 100;

  // 倉庫存儲(chǔ)的載體

  private LinkedList list = new LinkedList();

  // 鎖

  private final Lock lock = new ReentrantLock();

  // 倉庫滿的條件變量

  private final Condition full = lock.newCondition();

  // 倉庫空的條件變量

  private final Condition empty = lock.newCondition();

  // 生產(chǎn)num個(gè)產(chǎn)品

  public void produce(int num) {

  // 獲得鎖

  lock.lock();

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

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

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

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

  try {

  // 由于條件不滿足,生產(chǎn)阻塞

  full.await();

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  }

  // 生產(chǎn)條件滿足情況下,生產(chǎn)num個(gè)產(chǎn)品

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

  list.add(new Object());

  }

  System.out.print("【已經(jīng)生產(chǎn)產(chǎn)品數(shù)】:" + num);

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

  // 喚醒其他所有線程

  full.signalAll();

  empty.signalAll();

  // 釋放鎖

  lock.unlock();

  }

  // 消費(fèi)num個(gè)產(chǎn)品

  public void consume(int num) {

  // 獲得鎖

  lock.lock();

  // 如果倉庫存儲(chǔ)量不足

  while (list.size() < num) {

  System.out.print("【要消費(fèi)的產(chǎn)品數(shù)量】:" + num);

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

  try {

  // 由于條件不滿足,消費(fèi)阻塞

  empty.await();

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  }

  // 消費(fèi)條件滿足情況下,消費(fèi)num個(gè)產(chǎn)品

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

  list.remove();

  }

  System.out.print("【已經(jīng)消費(fèi)產(chǎn)品數(shù)】:" + num);

  System.out.println(" 【現(xiàn)倉儲(chǔ))量為】:" + 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:
聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
請(qǐng)您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
免費(fèi)領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
PMP?認(rèn)證榮獲北京市境外職業(yè)資格認(rèn)可!

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

2023-09-07 17:27:00
怎么選擇靠譜的短視頻運(yùn)營培訓(xùn)機(jī)構(gòu)?

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

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

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

2023-09-07 14:49:25
短視頻運(yùn)營培訓(xùn)機(jī)構(gòu)有用嗎?

短視頻運(yùn)營培訓(xùn)機(jī)構(gòu)有用嗎?短視頻的火熱,催生了一大批的網(wǎng)絡(luò)紅人、網(wǎng)紅賬號(hào),這些短視頻賬號(hào)通過實(shí)現(xiàn)粉絲流量變現(xiàn),獲得了非常豐厚的收入,自...詳情>>

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

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

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ū)