麻豆黑色丝袜jk制服福利网站-麻豆精品传媒视频观看-麻豆精品传媒一二三区在线视频-麻豆精选传媒4区2021-在线视频99-在线视频a

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

手機站
千鋒教育

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

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

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

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

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

來源:千鋒教育
發布人:千鋒老師
時間: 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() + " 暫時不能執行生產任務!");

  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() + " 暫時不能執行生產任務!");

  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() + " 暫時不能執行生產任務!");

  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() + " 暫時不能執行生產任務!");

  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年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師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
開班信息
北京校區
  • 北京校區
  • 大連校區
  • 廣州校區
  • 成都校區
  • 杭州校區
  • 長沙校區
  • 合肥校區
  • 南京校區
  • 上海校區
  • 深圳校區
  • 武漢校區
  • 鄭州校區
  • 西安校區
  • 青島校區
  • 重慶校區
  • 太原校區
  • 沈陽校區
  • 南昌校區
  • 哈爾濱校區
主站蜘蛛池模板: 美女黄视频免费| 动漫乱理伦片在线观看| 亚洲精品永久www忘忧草| 韩国三级日本三级香港三级黄| 欧美日韩国产精品自在自线| 国产真实迷j在线播放| 日韩高清欧美| 国产悠悠视频在线播放| 国产精品日本一区二区在线播放| zooslook欧美另类dogs| 欧美xxxx做受欧美| 大雄的性生活| 羞羞视频在线播放| 性久久久久久久| 渣男渣女抹胸渣男渣女| 大佬的365天第三季完整视频在线观看| 乱妇伦交| 欧洲最强rapper潮水免费| 亚洲免费mv| 久久精品综合| 波多野结衣中文字幕电影| 狠狠色狠狠色综合网| 真实国产乱子伦对白视频| 亚洲人成网亚洲欧洲无码| 国产孕妇做受视频在线观看| 老头猛挺进小莹的体内小说全集| 桃花影院www视频播放| 与子乱勾搭对白在线观看| 免费看一级淫片成人| 啊灬啊灬啊灬喷出来了| 欧美激情一级二级三级在线视频| jizz日本免费| 成年女人毛片免费视频| 精品剧情v国产在免费线观看| 四虎永久在线精品免费影视| 嗯!啊!使劲用力在线观看| 日本一道在线观看| 葫芦里不卖药葫芦娃app| 老子影院午夜伦手机不卡6080| 波多野结衣加勒比| 亚洲日韩精品欧美一区二区|