读锁和写锁的使用

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

/*

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

}

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航