麻豆黑色丝袜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
開班信息
北京校區
  • 北京校區
  • 大連校區
  • 廣州校區
  • 成都校區
  • 杭州校區
  • 長沙校區
  • 合肥校區
  • 南京校區
  • 上海校區
  • 深圳校區
  • 武漢校區
  • 鄭州校區
  • 西安校區
  • 青島校區
  • 重慶校區
  • 太原校區
  • 沈陽校區
  • 南昌校區
  • 哈爾濱校區
主站蜘蛛池模板: 草莓视频黄色在线观看| 毛片免费观看网址| 国产精品国产三级国产普通话| 欧美日韩电影在线| 玖玖玖影院| 日本欧美日韩| 中国内地毛片免费高清| 狠狠天天| a级精品国产片在线观看| 日本成人在线免费| lover视频无删减免费观看| 男人边吃奶边做性视频| 欧美美女毛茸茸| 女人张腿让男桶免费视频大全 | 国产又粗又猛又大的视频| 把腿抬起来就可以吃到扇贝了| 在线观看va| 欧美特黄色片| 中国国语毛片免费观看视频| 北美伦理电线在2019| 国产一精品一av一免费爽爽| 小镇姑娘hd电影在线观看 | 无遮挡h肉动漫网站| 快点使劲舒服爽视频| 欧美亚洲一二三区| 美女张开腿黄网站免费| 久久精品国产一区二区三区| 国产精品久久久久久久久久免费 | 国语精品高清在线观看| 丝瓜草莓www在线观看| 一个人晚上在线观看的免费视频| 黑人性片| 十九岁日本电影免费完整版观看| 日本巨黄视频| 男女做爽爽免费视频| 男人肌肌捅女人肌肌视频| 男男毛片| 欧美三级在线看| 免费a级毛片18以上观看精品| aaa一级黄色片| 四虎永久免费地址ww484e5566|