显示锁 Condition

作者: 韭菜待收割 | 来源:发表于2018-10-25 11:07 被阅读8次

1、Object提供的等待通知方法

public class MainTest {

    private static volatile int condition = 0;
    private static final Object object = new Object();

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (object) {
                    while (condition != 1) {
                        try {
                            object.wait();
                        } catch (InterruptedException e) {
                            Thread.currentThread().interrupt();
                        }
                    }
                    System.out.println("线程执行完毕");
                }
            }
        });
        thread.start();
        Thread.sleep(2000);
        condition = 1;
        synchronized (object) {
            object.notify();
        }
    }

}

2、显示锁提供的等待通知

public class MainTest {

    private static volatile int condition = 0;
    private static ReentrantLock reentrantLock = new ReentrantLock();
    private static Condition lockCondition = reentrantLock.newCondition();

    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                reentrantLock.lock();
                try {
                    while (condition != 1) {
                        //lockCondition.wait();//不是下面这个玩意
                        
                        //必须要获取到锁,不然报错;
                        //和对象的wait()必须在同步块中使用一个道理
                        lockCondition.await();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    reentrantLock.unlock();
                }

                System.out.println("线程执行完毕");
            }
        });
        thread.start();
        condition = 1;
        reentrantLock.lock();
        try {
            Thread.sleep(2000);
            lockCondition.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            reentrantLock.unlock();
        }
    }

}

3、区别

lock.newCondition() 获取多个Condition对象。
在一个lock对象上,可以有多个等待队列。
而Object的等待通知只有一个等待队列。

4、源码

Condition.await()会构造一个新的等待队列节点加入到等待队列队尾。
Condition.signal()会通知等待队列队首的节点,将节点加入同步队列。

见源码

Condition源码分析

相关文章

  • 显示锁 Condition

    1、Object提供的等待通知方法 2、显示锁提供的等待通知 3、区别 4、源码 Condition.await(...

  • 只唤醒对方线程,不唤醒本方线程(jdk5.0新特性)

    Lock 可视化锁,隐式锁边显示锁。 Lock( )获取锁unLock( )释放锁 支持多个Condition相关...

  • 70.原子变量和CAS 显示锁 72.显示条件(Condition) 73.并发容器 - 写时拷贝的List和Se...

  • ReentrantLock用法

    ReentrantLock实现同步锁 结果: Condition等待/唤醒 结果: 多个Condition实现部分...

  • AQS源码解析(8)Condition.await

    Condition条件锁,当线程获得锁之后,可以在指定的Condition上等待或被唤醒核心函数await: 下一...

  • Condition 源码分析 (基于Java 8)

    1. Condition 定义 Condition是JUC里面提供于控制线程释放锁, 然后进行等待其他获取锁的线程...

  • Condition原理和源码解析

    Condition 定义Condition是JUC里面提供于控制线程释放锁, 然后进行等待其他获取锁的线程发送 s...

  • java初入多线程8

    重入锁的好搭档:Condition条件 Condition 条件与Object 的wait 和Object.not...

  • 知识梳理目录

    Java基础 Java线程池 AQS之独占锁 AQS之Condition AQS之Condition AQS之同步...

  • 重入锁 Condition 读写锁 适用于读多写少场景 死锁

网友评论

    本文标题:显示锁 Condition

    本文链接:https://www.haomeiwen.com/subject/fxyqtqtx.html