yaochow@home:~$

【介绍】Condition

Condition 可以对锁进行更精确的控制。

Condition内部方法与Object的wait(), notify(), notifyAll()相似。

区别是Object的方法是在synchronized内使用,而Condition是在Lock中使用。

先看看栗子:

package com.yaochow.demo;


import org.junit.Test;

public class ObjectTest {

    @Test
    public void test() throws InterruptedException {

        Thread demo = new ThreadDemo("yaochow");
        synchronized (demo) {
            demo.start();
            System.out.println("wait yaochow finish");
            demo.wait();
            System.out.println("main go on");
        }
    }
}

class ThreadDemo extends Thread {

    public ThreadDemo(String name) {
        super(name);
    }

    @Override
    public void run() {
        synchronized (this) {
            System.out.println(Thread.currentThread().getName() + " finished.");
            notify();
        }
    }

}

输出:

wait yaochow finish
yaochow finished.
main go on

可以看到,在synchronized中,通过wait(), notify()可以更精确的控制线程的使用。

下面看看Condition的栗子:

package com.yaochow.demo;

import org.junit.Test;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ConditionTest {

    private static Lock lock = new ReentrantLock();
    private static Condition condition = lock.newCondition();

    @Test
    public void test() {

        try {
            Thread demo = new ConditionDemo("yaochow", lock, condition);
            lock.lock();
            demo.start();
            System.out.println("wait yaochow finish");
            condition.await();
            System.out.println("go on");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
}


class ConditionDemo extends Thread {

    private Lock lock;
    private Condition condition;

    public ConditionDemo(String name, Lock lock, Condition condition) {
        super(name);
        this.lock = lock;
        this.condition = condition;
    }

    @Override
    public void run() {
        lock.lock();
        try {
            System.out.println(Thread.currentThread().getName() + " finished.");
            condition.signal();
        } finally {
            lock.unlock();
        }
    }
}

输出:

wait yaochow finish
yaochow finished.
go on

看到了上面两个栗子,那Condition和Object里的方法比较,好在哪里呢?

一个Lock可以创建多个Condition,这样可以更精细的控制线程的操作。

源码下次在撸。