免费可以看的无遮挡av无码|国产在线拍揄自揄视频网站|在线无码精品视频播放在|欧美亚洲国产成人精品,国产成人久久77777精品,亚洲欧美视频在线观看,色偷偷色噜噜狠狠网站久久

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

手機站
千鋒教育

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

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

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

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

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

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

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

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

  - 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(" 【現倉儲量為】:" + 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(" 【現倉儲)量為】:" + 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(" 【現倉儲量為】:" + 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(" 【現倉儲)量為】:" + 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è)么?現在學習互聯網運營可不能只會單個的運營技術,企業(yè)更喜歡全能型人才。如今的互聯網世界有多種平臺,新媒體、短視頻...詳情>>

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

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

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ū)
开远市| 海兴县| 华宁县| 忻城县| 汶川县| 越西县| 抚顺市| 剑阁县| 准格尔旗| 赞皇县| 皮山县| 鲜城| 贵德县| 涡阳县| 仙桃市| 济宁市| 团风县| 嘉善县| 深泽县| 宜宾市| 西乌| 什邡市| 大余县| 开平市| 霞浦县| 道孚县| 贵州省| 呈贡县| 合阳县| 丘北县| 新沂市| 竹山县| 饶阳县| 剑川县| 都昌县| 务川| 依兰县| 阿拉善左旗| 广水市| 靖江市| 丹棱县|