package thread.lock;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* @file_name ReadAndWriteLockDemo.java
* @description 读写锁DEMO
* @author 张明亮
* @date 2009.09.27
*/
public class ReadAndWriteLockDemo {
ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
// 读锁
Lock rLock = rwLock.readLock();
// 写锁
Lock wLock = rwLock.writeLock();
// 货架
List stock = new ArrayList();
//互斥锁
ReentrantLock lock = new ReentrantLock();
/**
* 商品买卖
*
* 当商品数量小于1时,释放读锁并获取写锁 生产商品后,
*
* 锁降级在写锁保护下重新获取读锁并消费商品
*/
public void sell() {
// lock.lock();
try {
rLock.lock();
if (stock.size() <= 0) {
rLock.unlock();
wLock.lock();
manufacture();
rLock.lock();
wLock.unlock();
}
consume();
rLock.unlock();
} finally {
// lock.unlock();
}
}
/**
* 生产商品
*/
private void manufacture() {
stock.add("product");
}
/**
* 消费商品
*/
private void consume() {
System.err.println(stock.remove(0));
}
public static void main(String[] args) {
final ReadAndWriteLockDemo rwDemo = new ReadAndWriteLockDemo();
rwDemo.sell();
// Thread t1 = new Thread("threa--1") {
// public void run() {
// rwDemo.sell(