Java5对共享资源访问的解决方案:
1个锁上绑定多个监视器
package thread.lock;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 使用Java5新的共享资源处理方式
* Lock
* Condition
*
* 最大的不同:1个锁上可以绑定多个监视器!
* 让线程的等待与唤醒更明确
*/
public class TwoThreadsCommunication {
public static void main(String[] args) {
new TwoThreadsCommunication().justDoIt();
}
public void justDoIt() {
final ResourceHandler r = new ResourceHandler();
new Thread(new Runnable() {
public void run() {
for(int i=0;i<100;i++)
r.produce();
}
}, "线程A").start();
new Thread(new Runnable() {
public void run() {
for(int i=0;i<100;i++)
r.consume();
}
}, "线程B").start();
}
/**
* 资源类
* 使用Java5新增的处理资源共享的锁机制
*/
class ResourceHandler {
//synchronized -> lock
//wait() -> await(), notify() -> signal(), notifyAll() -> signalAll()
final Lock lock = new ReentrantLock();//唯一锁
//创建与lock绑定的不同Condition
final Condition con_produce = lock.newCondition();//生产者在lock锁上的监视器
final Condition con_consume = lock.newCondition();//消费者在lock锁上的监视器
//状态变量在资源内部进行操作
private boolean full;
//生产线程操作共享资源的方法
public void produce() {
//加锁
lock.lock();
try {
//notice: 这里用while,不要用if。可防止死锁!
while(full) {
try {
con_produce.await();/**生产者等待*/
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i=1;i<=10;i++) {
System.out.println(Thread.currentThread().getName()+" run***" + i);
}
full = true;
con_consume.signal();/**唤醒消费者*/
} finally {
//释放锁
lock.unlock();
}
}
//消费线程操作共享资源的方法
public void consume() {
//加锁
lock.lock();
try {
//notice: 这里用while,不要用if。可防止死锁!
while(!full) {
try {
con_consume.await();/**消费者等待*/
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j=1;j<=10;j++) {
System.out.println(Thread.currentThread().getName()+" run******" + j);
}
full = false;
con_produce.signal();/**唤醒生产者*/
} finally {
lock.unlock();
}
}
}
}