wait和notify方法,只能被同步监听对象来调用
Lock机制没有同步锁,所以不能调用
解决方案:Java5中提供了Lock机制的同时提供了处理Lock机制的通信控制的Condition接口
从Java5开始,可以:
1):使用Lock机制取代synchronized代码块和synchronized方法
2):使用Condition接口对象的await,signal,signalAll方法取代Object类中的wait,notify,notifyAll方法
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ShareResource {
private String name;
private String gender;
private boolean isEmpty=true; //表示共享资源对象是否为空的状态
private final Lock lock=new ReentrantLock();
private Condition condition=lock.newCondition();
//存储数据
public void push(String name,String gender) {
lock.lock();
try {
while(!isEmpty) {
condition.await();
}
//------生产开始------
this.name=name;
Thread.sleep(10);
this.gender=gender;
//-----生产结束-------
condition.signal();
isEmpty=false;
}catch(Exception e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
//取出数据
public void popup(){
lock.lock();
try {
while(isEmpty) {
condition.await();
}
Thread.sleep(10);
System.out.println(this.name+"--"+this.gender);
isEmpty=true;
condition.signal();
}catch(Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
}