多线程等待唤醒机制Lock,condition

Posted Luther-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程等待唤醒机制Lock,condition相关的知识,希望对你有一定的参考价值。

从JDK1.5 之后,提供新的等待唤醒机制Lock

之前用的wait(),notify(),notifyAll(),都是在JDK1.5之前使用,

不同的线程在锁住同一个对象后,调用wait()线程等待,notifyAll()唤醒所有的线程池里的线程,但是通常我们不需要唤醒所有的线程,只唤醒我们需要的线程即可,JDK1.5后提供Lock 接口。

上一个列子,做了下修改。

new ReentrantLock(); 是实现Lock 接口。

Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,也是就说再同一个锁下面可以创建N 个对象,每个对象都有独立的(wait、notify 和 notifyAll)方法,而之前的synchronized (r) 只用一个(wait、notify 和 notifyAll)方法。

 在Condition中,用await()替换wait(),用signal()替换notify(),用signalAll()替换notifyAll(),传统线程的通信方式,Condition都可以实现,这里注意,Condition是被绑定到Lock上的,要创建一个Lock的Condition必须用newCondition()方法。

所以condition 是更高效的线程通信方式

package util;

public class Input implements Runnable
private Resource1 r;
public Input(Resource1 r)
this.r = r;

public void run()
int x = 0;
while(true)
if(x == 0)
r.set("mike", "man");
else
r.set("林心如", "女");

x = (x+1)%2;




package util;
public class Output implements Runnable
private Resource1 r;
public Output(Resource1 r)
this.r = r;

public void run()
while(true)
r.out();




package util;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Resource1
public static Resource1 r = null;
private String name;
private String sex;
private boolean flag = false;

private Lock lock = new ReentrantLock();
private Condition condition_set = lock.newCondition();
private Condition condition_out = lock.newCondition();


public void set(String name,String sex)
lock.lock();
try
while(flag)
condition_set.await();
this.name = name;
this.sex = sex;
System.out.println("生产"+Thread.currentThread().getName()+ r.name+"-----"+r.sex);
flag = true;
condition_out.signal();

catch (InterruptedException e)
e.printStackTrace();
finally
lock.unlock();



public void out()
lock.lock();
try
while(!flag)
condition_out.await();

System.out.println("消费"+Thread.currentThread().getName()+ r.name+"-----"+r.sex);
flag = false;
condition_set.signal();
catch (InterruptedException e)
e.printStackTrace();
finally
lock.unlock();



public static Resource1 getResource()
if(r == null)
synchronized (Resource1.class)
if(r == null)
r = new Resource1();



return r;



package util;


public class InputOuputDemo

public static void main(String[] args)
Input i = new Input(Resource1.getResource());
Output o = new Output(Resource1.getResource());

Thread t1 = new Thread(i);
Thread t2 = new Thread(o);
Thread t3 = new Thread(i);
Thread t4 = new Thread(o);
Thread t5 = new Thread(i);
Thread t6 = new Thread(o);
Thread t7 = new Thread(i);
Thread t8 = new Thread(o);

t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
t6.start();
t7.start();
t8.start();


以上是关于多线程等待唤醒机制Lock,condition的主要内容,如果未能解决你的问题,请参考以下文章

多线程之间的通信(等待唤醒机制Lock 及其它线程的方法)

多线程的等待唤醒(使用监视器)

死锁Lock锁等待唤醒机制线程组线程池定时器单例设计模式_DAY24

java多线程笔记--顺序执行

Condition

当锁定不可用时,调用Lock.lock()的线程何时从调用返回?