1.使用Lock和Condition的意义
JDK1.5中提供了多线程升级的解决方案。
1.将同步synchronized替换成现实Lock操作。
2.将Object中的wait,notify,notifyAll,替换为了Condition对象
3.该Condition对象可以对Lock锁进行获取。
4.使用Condition对象,能够实现本方只唤醒对方的操作(即只唤醒需要运行的线程,不用把所有的线程全部唤醒)不需要再使用 notifyAll() 把所有的线程唤醒。
5.Lock:替代了Synchronized
Lock中的方法:
lock
unlock
newConditon()
6.Condition:替代了 Object中的 wait() notify() notifyAll()
Condition中的方法:
await();
signal();
signalAll();
2.改写原来用Synchronized的生产者消费者代码/**
*
*/
package threadCommnication;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Resource {
String name;
private int count = 1;
/**
* 标志位
* flag = false 表示没有资源了,要生产,消费者不能取
* flage = ture 表示有资源,不要生产,消费者可以取
*/
private boolean flag = false;
//定义锁对象
private Lock lock = new ReentrantLock();
//对于生产者的锁
private Condition condition_Producer = lock.newCondition();
//对于消费者的锁
private Condition condition_consumer = lock.newCondition();
public void set(String name) throws InterruptedException
{
lock.lock();
try{
while(flag){
//当有资源时,告诉生产者等待
condition_Producer.await();
}
this.name = name+"--"+count++;
System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);
flag = true;
//生产完后,通知消费者来取,唤醒消费者线程
condition_consumer.signal();
}finally{
//释放锁的动作一定要执行。
lock.unlock();
}
}
public void out() throws InterruptedException{
lock.lock();
try{
while(flag == false){
//当没有资源时等待生产者生产
condition_consumer.wait();
}
//有资源,消费
System.out.println(Thread.currentThread().getName()+"...消费者........."+this.name);
flag = false;
//通知生产者来生产
condition_Producer.signal();
}finally{
lock.unlock();
}
}
}
/**
*
*/
package threadCommnication;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Resource {
String name;
private int count = 1;
/**
* 标志位
* flag = false 表示没有资源了,要生产,消费者不能取
* flage = ture 表示有资源,不要生产,消费者可以取
*/
private boolean flag = false;
//定义锁对象
private Lock lock = new ReentrantLock();
//对于生产者的锁
private Condition condition_Producer = lock.newCondition();
//对于消费者的锁
private Condition condition_consumer = lock.newCondition();
public void set(String name) throws InterruptedException
{
lock.lock();
try{
while(flag){
//当有资源时,告诉生产者等待
condition_Producer.await();
}
this.name = name+"--"+count++;
System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);
flag = true;
//生产完后,通知消费者来取,唤醒消费者线程
condition_consumer.signal();
}finally{
//释放锁的动作一定要执行。
lock.unlock();
}
}
public void out() throws InterruptedException{
lock.lock();
try{
while(flag == false){
//当没有资源时等待生产者生产
condition_consumer.wait();
}
//有资源,消费
System.out.println(Thread.currentThread().getName()+"...消费者........."+this.name);
flag = false;
//通知生产者来生产
condition_Producer.signal();
}finally{
lock.unlock();
}
}
}