当前位置: 首页 > article >正文

Java 21的Concurrency的笔记

  • Java Core Libraries
  • Concurrency
    Concurrency API包括:
    • Virtual threads

    • Structured concurrency

    • Task scheduling framework
      即线程池,常见、易用。

    • Fork/join framework
      即ForkJoinPool,不过目前还没有在项目中实际使用过。

    • Concurrent collections
      线程安全的容器,比如BlockingQueue/BlockingDeque。

    • Atomic variables
      原子变量,在java.util.concurrent.atomic下的类,比如AtomicInteger。

    • Synchronizers
      比如Semaphore/CyclicBarrier/CountdownLatch/Phaser/Exchanger。
      不过目前在项目交付过程中,暂时没有使用过。

    • Locks
      java.util.concurrent.locks包内的类。
      目前在项目交付时,Java语言的关键字synchronized的应用场景更多一些。

    • Nanosecond-granularity timing
      之前在项目中,大量使用的是System.currentTimeMillis,在时间跳变时,计算时间差时可能得到负数。
      System.nanoTime作为后起之秀,据说不存在类似的问题。

    • Thread-local variables
      曾经使用过ThreadLocal,不过机会不多,可能场景比较简单,没有遇到过什么问题。

Virtual Threads

在Linux系统下,按照用户线程和内核线程的关系来分类:

  • 1:1,即一个用户线程,对应一个内核线程。
    比如Linux的Pthread,JDK的Thread,STL的std::thread。
    优点是实现简单,线程的运行、调度、运行,均由操作系统完成。
    缺点是线程的数量受限,随着线程数量上升,操作系统调整线程运行的成本逐步上升。
  • N:1,即多个用户线程,对应一个内核线程。
    实现复杂,用户线程的调度、运行等工作在用户态,因此可以创建更多的线程。
    缺点是当一个用户线程被IO阻塞时,绑定在内核线程上的其它用户线程,同步被阻塞。
  • M:N,即用户线程和内核线程为多对多关系,二者不是强绑定关系。
    实现复杂,可以解决N:1方案存在的问题。

线程的使用方式:

  • 同步模式
    • 每请求每线程
    • 线程池
    • Reactor模式
  • 异步模式
    • 异步任务
    • 消息队列
官方文档
  • Virtual Threads

    However, a virtual thread isn’t tied to a specific OS thread. A virtual thread still runs code on an OS thread. However, when code running in a virtual thread calls a blocking I/O operation, the Java runtime suspends the virtual thread until it can be resumed. The OS thread associated with the suspended virtual thread is now free to perform operations for other virtual threads.

    依据上述描述,Java的Virtual Threads有点类似前述的M:N的关系。

    Virtual threads are suitable for running tasks that spend most of the time blocked, often waiting for I/O operations to complete. However, they aren’t intended for long-running CPU-intensive operations.

    依据上述说明,Java的Virtual Threads适合执行经常阻塞的任务,而不是长时间的计算密集型任务。

  • JEP 444

  • java.lang.Thread

  • Foreign Function and Memory API

参考资料
  • 线程的三种实现模型
  • linux:线程的3种实现方式(内核级,用户级和混合型)
  • 线程模型简介
  • Netty的三种线程模型
  • Netty(1)线程模型【常识】
  • 【Linux线程(三)】生产者消费者模型
  • Linux线程(四) 生产者消费者模型
  • 多线程(一)高并发和多线程的关系
  • 多线程(二)使用多线程的准备知识
  • 多线程(三) java中线程的简单使用
  • 多线程(四) 如何停止线程
  • 多线程(五) java的线程锁
  • 多线程(五) java的线程锁
  • 多线程(六)线程间的通信和协作
  • 多线程(七)JDK原生线程池
  • 多线程(八)常用的线程模型

Structured Concurrency

  • Structured Concurrency

    This is a preview feature.

    作为预览版的特性,相关的API的设计目前仍然存在变数,因此当前不建议在项目中使用。
    从官方提供的样例看,对于某些临时创建线程池执行任务的场景,可以简化实现代码,同时质量更好。

        Callable<String> task1 = ...
        Callable<Integer> task2 = ...
    
        try (var scope = new StructuredTaskScope<Object>()) {
    
            Subtask<String> subtask1 = scope.fork(task1);
            Subtask<Integer> subtask2 = scope.fork(task2);
    
            scope.join();
    
            ... process results/exceptions ...
    
        } // close
    
  • JEP 453

  • Preview Language and VM Features

Thread-Local Variables

  • Thread-Local Variables
    不易跟踪、管理的可变性。
    生命周期的管理,创建、传播、读、写等,潜在的内存泄漏问题。
    不恰当的使用或者滥用,可能导致占用过多的内存资源。

http://www.kler.cn/news/305355.html

相关文章:

  • 【架构设计模式-1】代理模式
  • 物品识别——基于python语言
  • python深拷贝和浅拷贝的实验
  • python学习第八节:爬虫的初级理解
  • 远程跨境传输大文件如何做到安全又稳定?
  • 使用Selenium进行网页自动化
  • 水平垂直居中的几种方法(总结)
  • 【浅谈】单片机基本概念
  • 在WPF中使用矢量图标
  • 【ArcGISProSDK】初识
  • Vue Router push方法的使用
  • vm虚拟机中ubuntu连不上网络,网络图标消失解决办法
  • 技术成神之路:设计模式(十三)访问者模式
  • 2.1 溪降技术:溪降运动的定义
  • 链路层和交换网_计算机网络
  • vue+el-table 可输入表格使用上下键进行input框切换
  • Qt常用控件——QSpinBox
  • STM32的寄存器深度解析
  • Mysql的高级查询:SQL关联查询(内连接/外连接/自连接)/子查询
  • uni-app和Node.js使用uni-push2.0实现通知栏消息推送功能
  • Centos挂载和删除nfs
  • python选择排序算法
  • 基于Java+Mysql实现(web)大型企业管理系统
  • API安全测试 | Postman + BurpSuite 配置证书代理
  • chapter14-集合——(List)——day17
  • 828华为云征文|部署在线文件管理器 Spacedrive
  • 大数据-132 - Flink SQL 基本介绍 与 HelloWorld案例
  • 【LLM多模态】CogVideoX文生视频模型结构和训练过程
  • 【openGauss】检查工具gs_check,gs_checkperf的应用
  • Redisson 异步释放锁