首页 > 学院 > 开发设计 > 正文

读锁和写锁的使用

2019-11-18 14:42:25
字体:
来源:转载
供稿:网友
读锁和写锁的使用


/*

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);
    }
  }
}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表