并发编程 - Lock的通信方式Condition的使用和源码解析

Condition的使用和原理

Lock的通信方式:condition

Condition的使用

ConditionWait

public class ConditionWait implements Runnable{

    private Lock lock;
    private Condition condition;

    public ConditionWait(Lock lock, Condition condition) {
        this.lock = lock;
        this.condition = condition;
    }

    @Override
    public void run() {
        try {
            lock.lock(); //竞争锁
            try {
                System.out.println("begin - ConditionWait");
                condition.await(); //阻塞
                System.out.println("end - ConditionAwait");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }finally {
            lock.unlock(); //释放锁
        }
    }
}

ConditionNotify

package com.exercise.exercise_0831;

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

public class ConditionNotify implements Runnable {

    private Lock lock;
    private Condition condition;

    public ConditionNotify(Lock lock, Condition condition) {
        this.lock = lock;
        this.condition = condition;
    }

    @Override
    public void run() {
        try {
            lock.lock(); //竞争锁
            System.out.println("begin - ConditionNotify");
            condition.signal(); //唤醒阻塞状态的线程
//            condition.signalAll(); //唤醒所有阻塞状态的线程
            System.out.println("end - ConditionSignal");
        } finally {
            lock.unlock(); //释放锁
        }
    }
}

TEST

package com.exercise.exercise_0831;

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

public class App {
    public static void main(String[] args) {
        Lock lock = new ReentrantLock();
        Condition condition = lock.newCondition();

        new Thread(new ConditionWait(lock, condition)).start();
        new Thread(new ConditionNotify(lock, condition)).start();
    }
}

在这里插入图片描述
整体流程分析如下:
在这里插入图片描述
总体流程:
在这里插入图片描述

源码解析

AQS.await()

在这里插入图片描述

第一步:addConditionWaiter

在这里插入图片描述

第二步:fullyRelease

在这里插入图片描述

第三步:isOnSyncQueue

在这里插入图片描述

AQS.signal()

在这里插入图片描述

原创文章 88 获赞 21 访问量 3万+

猜你喜欢

转载自blog.csdn.net/cfy1024/article/details/100176324