WEB开发网
开发学院WEB开发Jsp 读锁和写锁的使用 阅读

读锁和写锁的使用

 2008-01-05 09:02:37 来源:WEB开发网   
核心提示:/*Software Architecture Design Patterns in javaby Partha KUChana Auerbach Publications*/public class ReadWriteLockTest {public static void main(String[] args) {
读锁和写锁的使用


/*

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

Tags:使用

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接