Java Lock锁多线程中实现流水线任务

网友投稿 287 2022-12-08


Java Lock锁多线程中实现流水线任务

下面程序代码通过使用Lock锁执行简单的流水线任务:

import java.util.concurrent.locks.Condition;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

/**

* @author lzq

* @data 2020/4/29 0029 - 下午 9:48

*/

public class TestLock {

public static void main(String[] args) {

DataSource dataSource=new DataSource();

new Thread(() -> {

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

dataSource.a();

}

},"A").start();

new Thread(() -> {

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

dataSource.b();

}

},"B").start();

new Thread(() -> {

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

dataSource.c();

}

},"C").start();

}

}

class DataSource{

private int x=1;

private Lock lock=new ReentrantLock();

private Condition condition1=lock.newCondition();

private Condition condition2=lock.newCondition();

private Condition condition3=lock.newCondition();

public void a(){

lock.lock();

try {

while(x!=1){

condition1.await();

}

System.out.println(Thread.currentThread().getName()+":aaa");

x=2;

condition2.signal();

} catch (InterruptedException e) {

e.prinNVzkGtStackTrace();

} finally {

lock.unlock();

}

}

public void b(){

lock.lock();

try {

while(x!=2){

condition2.await();

}

System.out.println(Thread.currentThread().getName()+":bbb");

x=3;

condition3.signal();

} catch (InterruptedException e) {

e.printStackTrace();

} finally {

lock.unlock();

}

}

public void c(){

lock.lock();

try {

while(x!=3){

condition3.await();

}

System.out.println(Thread.currentThread().getName()+":ccc");

x=1;

condition1.signal();

} catch (InterruptedException e) {

e.printStackTrace();

} finally {

lock.unlock();

}

}

}

执行结果如下:

对于上面代码简单分析:代码中包含简单的生产者消费者流程和Lock实现三部曲,即重复判断条件,执行逻辑,唤醒其他线程和产生锁,加锁,解锁。注意这里一点,条件判断一定要重复判断,不然可能会导致线程假醒影响结果。

因为当线程处于等待状态时,线程会释放资源,等到被唤醒的时候,从上次await的地方醒来继续执行,这时条件判断成立,执行await,其他线程再修改条件使得本线程被唤醒,此时本线程不会继续判断,而是继续执行,如果使用循环判断就能检验出条件被修改。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java Callable接口实现细节详解
下一篇:Java泛型机制必要性及原理解析
相关文章

 发表评论

暂时没有评论,来抢沙发吧~