正在自学java,在多线程部分看到Lock与Condition部分的内容,有点不明白。
Condition producer_con = lock.newCondition();
Condition consumer_con = lock.newCondition();
public void set(String name)
{
lock.lock();
try
{
while(flag) //若有烤鸭,就不生产
try{producer_con.await();}catch(InterruptedException e){}
this.name = name + count;
count++;
System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name);
flag = true;
consumer_con.signal();
}
finally
{lock.unlock();}
}
我不明白,Condition对象与线程是怎么绑定的?难道是,某个线程是由哪个Condition对象调用await()阻塞的,就由哪个Condition对象唤醒?那么因为没有获取锁而自动阻塞的线程又怎么解释?
多个生产者线程都会使用同一个producer_con ,多个消费者线程都使用同一个consumer_con
这样线程内部,就会根据await和signal来在线程之间同步
谢谢您,我知道这样可以控制多线程同步,但是不知道是如何将Condition对象与线程进行绑定的。例如,我写的代码的倒数第三行:
consumer_con.signal();
那么编译器看到这句后,会唤醒与consumer_con对象绑定的一个线程,但是代码里从没有显示将consumer_con对象与某个线程进行关联呀,仅仅是在方法里面调用了consumer_con的await()和signal()方法。
Condition 条件和线程执行顺序一点关系都没有,真正控制线程顺序的是标志位,也就是说用一个Condition来做等待和唤醒就行了,之所以很多教学或者demo中控制线程指定顺序时,要定义多个条件,要么就是以讹传讹,以为Condition能唤醒指定线程,要么就是为了代码逻辑更清晰,便于阅读。你想想,如果Condition可以指定唤醒线程,那还要标志位干什么?再试,在创建多个Condition对象的时候,有指定是和哪个线程绑定吗?
很明显,condition本身并不具备控制线程的能力,线程都是通过操作系统来进行统一调度的,是随机的,condition只是起到了一个阻塞和唤醒的作用,真正达到操作线程效果的是标识位