天天看点

java lock condition_玩转Java多线程(Lock.Condition的正确使用姿式)

转载请标明博客的地址html

本人博客和github帐号,若是对你有帮助请在本人github项目AioSocket上点个star,激励做者对社区贡献java

我的github: https://github.com/haibiscuit?tab=repositories

看到就是赚到,本博客只会贴出干货,欢迎光顾git

本篇讲的是lock.condition()的正确使用方式(也是以前看过的一篇,今天又把他实现出来)github

首先,代码逻辑规则以下:ide

1.使用3个线程依次打印ABCoop

直接上代码:ui

package Thread;this

import java.util.concurrent.locks.Condition;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

public class LockConditionTest{

public static void main(String[] args) {

final AlternateDemo ad = new AlternateDemo();

new Thread(new Runnable() {

@Override

public void run() {

for (int i = 0; i < 10; i++) {

ad.loopA();

}

}

}, "A").start();

new Thread(new Runnable() {

@Override

public void run() {

for (int i = 0; i < 10; i++) {

ad.loopB();

}

}

}, "B").start();

new Thread(new Runnable() {

@Override

public void run() {

for (int i = 0; i < 10; i++) {

ad.loopC();

System.out.println("-----------------------------------");

}

}

}, "C").start();

}

}

class AlternateDemo {

private int number = 1; //当前正在执行线程的标记,至关于状态标记

private Lock lock = new ReentrantLock();

private Condition condition1 = lock.newCondition();

private Condition condition2 = lock.newCondition();

private Condition condition3 = lock.newCondition();

public void loopA() {

lock.lock();

try {

//1. 判断

if (number != 1) {

condition1.await();

}

//2. 打印

System.out.println(Thread.currentThread().getName());

//3. 唤醒

number = 2;

condition2.signal();

} catch (Exception e) {

e.printStackTrace();

} finally {

lock.unlock();

}

}

public void loopB() {

lock.lock();

try {

//1. 判断

if (number != 2) {

condition2.await();

}

//2. 打印

System.out.println(Thread.currentThread().getName());

//3. 唤醒

number = 3;

condition3.signal();

} catch (Exception e) {

e.printStackTrace();

} finally {

lock.unlock();

}

}

public void loopC() {

lock.lock();

try {

//1. 判断

if (number != 3) {

condition3.await();

}

//2. 打印

System.out.println(Thread.currentThread().getName());

//3. 唤醒

number = 1;

condition1.signal();

} catch (Exception e) {

e.printStackTrace();

} finally {

lock.unlock();

}

}

}线程

总结:1.与wait对比,wait方式须要依赖synchronized代码块,而condtion.wait()依赖Lock对象,而且代码更加灵活htm

2.condition.wait()能够将不一样条件下的线程放入不一样的等待队列,而单纯的wait()方法会将全部状况下的线程放入一个等待队列,这样在大量线程唤醒时会形成资源浪费

3.使用Lock对象进行同步,这样线程同步只须要依赖Lock对象,而使用原始的synchronized(this){}进行同步,须要依赖当前对象,笔者更喜欢Lock同步的方式

原文出处:https://www.cnblogs.com/haibiscuit/p/11098072.html