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

    1. <style id="76ofp"></style>

      <style id="76ofp"></style>
      <rt id="76ofp"></rt>
      <form id="76ofp"><optgroup id="76ofp"></optgroup></form>
      1. 千鋒教育-做有情懷、有良心、有品質(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è)  >  行業(yè)資訊  > Java開(kāi)發(fā)面試題:如何保證同一資源被多個(gè)線程并發(fā)訪問(wèn)時(shí)的完整性?

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

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

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

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

          - wait()/notify()方法

          - await()/signal()方法

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

          - PipedInputStream/PipedOutputStream

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

          ```

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

          private int num;

          // 所在放置的倉(cāng)庫(kù)

          private Storage storage;

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

          public Producer(Storage storage) {

          this.storage = storage;

          }

          // 線程run函數(shù)

          public void run() {

          produce(num);

          }

          // 調(diào)用倉(cāng)庫(kù)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)者類(lèi):

          ```

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

          private int num;

          // 所在放置的倉(cāng)庫(kù)

          private Storage storage;

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

          public Consumer(Storage storage) {

          this.storage = storage;

          }

          // 線程run函數(shù)

          public void run() {

          consume(num);

          }

          // 調(diào)用倉(cāng)庫(kù)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;

          }

          }

          ```

          倉(cāng)庫(kù)類(lèi):(wait()/notify()方法)

          ```

          public class Storage { // 倉(cāng)庫(kù)最大存儲(chǔ)量

          private final int MAX_SIZE = 100;

          // 倉(cāng)庫(kù)存儲(chǔ)的載體

          private LinkedList list = new LinkedList();

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

          public void produce(int num) {

          // 同步代碼段

          synchronized (list) {

          // 如果倉(cāng)庫(kù)剩余容量不足

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

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

          System.out.println(" 【庫(kù)存量】:" + 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)倉(cāng)儲(chǔ)量為】:" + list.size());

          list.notifyAll();

          }

          }

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

          public void consume(int num) {

          // 同步代碼段

          synchronized (list) {

          // 如果倉(cāng)庫(kù)存儲(chǔ)量不足

          while (list.size() < num) {

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

          System.out.println(" 【庫(kù)存量】:" + 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)倉(cāng)儲(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;

          }

          }

          ```

          倉(cāng)庫(kù)類(lèi):(await()/signal()方法)

          ```

          public class Storage { // 倉(cāng)庫(kù)最大存儲(chǔ)量

          // 倉(cāng)庫(kù)最大存儲(chǔ)量

          private final int MAX_SIZE = 100;

          // 倉(cāng)庫(kù)存儲(chǔ)的載體

          private LinkedList list = new LinkedList();

          // 鎖

          private final Lock lock = new ReentrantLock();

          // 倉(cāng)庫(kù)滿的條件變量

          private final Condition full = lock.newCondition();

          // 倉(cāng)庫(kù)空的條件變量

          private final Condition empty = lock.newCondition();

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

          public void produce(int num) {

          // 獲得鎖

          lock.lock();

          // 如果倉(cāng)庫(kù)剩余容量不足

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

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

          System.out.println(" 【庫(kù)存量】:" + 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)倉(cāng)儲(chǔ)量為】:" + list.size());

          // 喚醒其他所有線程

          full.signalAll();

          empty.signalAll();

          // 釋放鎖

          lock.unlock();

          }

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

          public void consume(int num) {

          // 獲得鎖

          lock.lock();

          // 如果倉(cāng)庫(kù)存儲(chǔ)量不足

          while (list.size() < num) {

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

          System.out.println(" 【庫(kù)存量】:" + 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)倉(cāng)儲(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)您保持通訊暢通,專(zhuān)屬學(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)營(yíng)培訓(xùn)機(jī)構(gòu)?

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

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

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

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

        短視頻運(yùn)營(yíng)培訓(xùn)機(jī)構(gòu)有用嗎?短視頻的火熱,催生了一大批的網(wǎng)絡(luò)紅人、網(wǎng)紅賬號(hào),這些短視頻賬號(hào)通過(guò)實(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ī)模龐大、種類(lèi)多樣、處理復(fù)雜。目前,大數(shù)據(jù)行業(yè)已經(jīng)成為全球...詳情>>

        2023-09-06 13:42:47
        開(kāi)班信息
        北京校區(qū)
        • 北京校區(qū)
        • 大連校區(qū)
        • 廣州校區(qū)
        • 成都校區(qū)
        • 杭州校區(qū)
        • 長(zhǎng)沙校區(qū)
        • 合肥校區(qū)
        • 南京校區(qū)
        • 上海校區(qū)
        • 深圳校區(qū)
        • 武漢校區(qū)
        • 鄭州校區(qū)
        • 西安校區(qū)
        • 青島校區(qū)
        • 重慶校區(qū)
        • 太原校區(qū)
        • 沈陽(yáng)校區(qū)
        • 南昌校區(qū)
        • 哈爾濱校區(qū)
        英德市| 古浪县| 甘孜县| 长治市| 巨鹿县| 固阳县| 桓台县| 肇东市| 惠来县| 五指山市| 论坛| 郧西县| 瓮安县| 新晃| 九龙县| 东丽区| 静宁县| 南京市| 唐海县| 七台河市| 岑巩县| 建平县| 许昌县| 黑龙江省| 普定县| 乐东| 昆明市| 临朐县| 淮安市| 那曲县| 永泰县| 同德县| 庆云县| 革吉县| 崇明县| 安岳县| 余姚市| 沙田区| 尚义县| 揭西县| 宝坻区|