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

 更新时间:2020年05月01日 12:30:54   作者:DescribeMe  
这篇文章主要介绍了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.printStackTrace();
    } 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,其他线程再修改条件使得本线程被唤醒,此时本线程不会继续判断,而是继续执行,如果使用循环判断就能检验出条件被修改。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • MyBatis和MyBatis Plus并存问题及解决

    MyBatis和MyBatis Plus并存问题及解决

    最近需要使用MyBatis和MyBatis Plus,就会导致MyBatis和MyBatis Plus并存,本文主要介绍了MyBatis和MyBatis Plus并存问题及解决,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • 注解、原生Spring、SchemaBased三种方式实现AOP代码案例

    注解、原生Spring、SchemaBased三种方式实现AOP代码案例

    这篇文章主要介绍了注解、原生Spring、SchemaBased三种方式实现AOP的方法介绍,文中有详细的代码示例,对我们的学习有一定的帮助,需要的朋友可以参考下
    2023-06-06
  • Java中EasyPoi多sheet导出功能实现

    Java中EasyPoi多sheet导出功能实现

    这篇文章主要介绍了Java中EasyPoi多sheet导出功能实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • idea版本控制忽略.idea文件和.iml文件的问题

    idea版本控制忽略.idea文件和.iml文件的问题

    这篇文章主要介绍了idea版本控制忽略.idea文件和.iml文件,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 解析Mybatis连续传递多个参数的方法

    解析Mybatis连续传递多个参数的方法

    MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架,这篇文章主要介绍了Mybatis连续传递多个参数的方法,需要的朋友可以参考下
    2016-08-08
  • Springboot整合logback多节点日志文件加端口号区分的操作方法

    Springboot整合logback多节点日志文件加端口号区分的操作方法

    这篇文章主要介绍了Springboot整合logback多节点日志文件加端口号区分的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • Java ByteBuffer网络编程用法实例解析

    Java ByteBuffer网络编程用法实例解析

    这篇文章主要介绍了Java ByteBuffer网络编程用法实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Java中基于注解的代码生成工具MapStruct映射使用详解

    Java中基于注解的代码生成工具MapStruct映射使用详解

    MapStruct 作为一个基于注解的代码生成工具,为我们提供了一种更加优雅、高效的解决方案,本文主要为大家介绍了它的具体使用,感兴趣的可以了解下
    2025-02-02
  • 学习在一台新电脑上配置JAVA开发环境

    学习在一台新电脑上配置JAVA开发环境

    本文主要介绍了如何在一台新电脑上配置JAVA开发环境,每一个步骤都有对应的截图和文字说明,需要的朋友可以参考下
    2015-07-07
  • Java枚举类与注解,新手一篇搞定它

    Java枚举类与注解,新手一篇搞定它

    枚举类型是Java 5新增的特性,它是一种新的类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示。由于Java 不支持多继承,所以枚举对象不能再继承其他类(可以实现接口)
    2021-06-06

最新评论