国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

讀鎖和寫鎖的使用

2019-11-18 14:42:25
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
讀鎖和寫鎖的使用


/*

Software Architecture Design Patterns in java
by Partha KUChana 

Auerbach Publications

*/

public class ReadWriteLockTest {

  public static void main(String[] args) {
    Item item = new Item("CompScience-I");
    new MemberTransaction("Member1", item, "StatusCheck");
    new MemberTransaction("Member2", item, "StatusCheck");
    new MemberTransaction("Member3", item, "CheckOut");
    new MemberTransaction("Member4", item, "CheckOut");
    new MemberTransaction("Member5", item, "CheckOut");
    new MemberTransaction("Member6", item, "StatusCheck");

  }
}

class Item {

  PRivate String name;

  private ReadWriteLock rwLock;

  private String status;

  public Item(String n) {
    name = n;
    rwLock = new ReadWriteLock();
    status = "N";
  }

  public void checkOut(String member) {
    rwLock.getWriteLock();
    status = "Y";
    System.out.println(member + " has been issued a write lock-ChkOut");
    rwLock.done();
  }

  public String getStatus(String member) {
    rwLock.getReadLock();
    System.out.println(member + " has been issued a read lock");
    rwLock.done();
    return status;
  }

  public void checkIn(String member) {
    rwLock.getWriteLock();
    status = "N";
    System.out.println(member + " has been issued a write lock-ChkIn");
    rwLock.done();
  }
}

class ReadWriteLock {

  private Object lockObj;

  private int totalReadLocksGiven;

  private boolean writeLockIssued;

  private int threadsWaitingForWriteLock;

  public ReadWriteLock() {
    lockObj = new Object();
    writeLockIssued = false;
  }

  /*
   * A read lock can be issued if there is no currently issued write lock and
   * there is no thread(s) currently waiting for the write lock
   */

  public void getReadLock() {
    synchronized (lockObj) {
      while ((writeLockIssued)  (threadsWaitingForWriteLock != 0)) {
        try {
          lockObj.wait();
        } catch (InterruptedException e) {
          //
        }
      }
      //System.out.println(" Read Lock Issued");
      totalReadLocksGiven++;
    }
  }

  /*
   * A write lock can be issued if there is no currently issued read or write
   * lock
   */

  public void getWriteLock() {
    synchronized (lockObj) {
      threadsWaitingForWriteLock++;

      while ((totalReadLocksGiven != 0)  (writeLockIssued)) {
        try {
          lockObj.wait();
        } catch (InterruptedException e) {
          //
        }
      }
      //System.out.println(" Write Lock Issued");
      threadsWaitingForWriteLock--;
      writeLockIssued = true;

    }
  }

  //used for releasing locks
  public void done() {
    synchronized (lockObj) {

      //check for errors
      if ((totalReadLocksGiven == 0) && (!writeLockIssued)) {
        System.out.println(" Error: Invalid call to release the lock");
        return;
      }
      if (writeLockIssued)
        writeLockIssued = false;
      else
        totalReadLocksGiven--;

      lockObj.notifyAll();
    }

  }

}

class MemberTransaction extends Thread {

  private String name;

  private Item item;

  private String Operation;

  public MemberTransaction(String n, Item i, String p) {
    name = n;
    item = i;
    operation = p;
    start();
  }

  public void run() {
    //all members first read the status
    item.getStatus(name);

    if (operation.equals("CheckOut")) {
      System.out.println("/n" + name + " is ready to checkout the item.");
      item.checkOut(name);
      try {
        sleep(1);
      } catch (InterruptedException e) {
        //
      }
      item.checkIn(name);
    }
  }
}


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 竹山县| 太白县| 昌平区| 巴东县| 凤冈县| 临颍县| 八宿县| 桦川县| 盐边县| 宣化县| 赣州市| 庄浪县| 进贤县| 通江县| 尉犁县| 顺平县| 哈尔滨市| 蓬安县| 平阳县| 廊坊市| 昭平县| 西华县| 大化| 龙州县| 京山县| 石屏县| 子长县| 重庆市| 凉城县| 漳平市| 长春市| 堆龙德庆县| 浠水县| 炉霍县| 景洪市| 宿州市| 留坝县| 建阳市| 武清区| 巢湖市| 冷水江市|