首页 > 编程语言 >Java21虚拟线程的注意点

Java21虚拟线程的注意点

时间:2023-09-13 15:05:01浏览次数:52  
标签:Java21 复制 ThreadLocal 虚拟 线程 io

Java21虚拟线程的注意点

  1. ThreadLocal能继续用么?Java 开发组设计虚拟线程的时候,原本想去掉对 ThreadLocal 的支持。但由于使用它的库太多,并且很多为了传参才用,并不是缓存,所以就保持了支持。像隐式传参的这种场景,继续用也没事儿,就是性能有所损耗。(不会影响 GC,生命周期随着虚拟线程终止,但是线程本地变量数量变多,哈希表变大,需要频繁清理)。千万别在虚拟线程的 ThreadLocal 存放大对象。Java 开发组是想通过 ScopedLocal 替换掉 ThreadLocal(这个没有大哈希表的问题),但是在 21 还只是 preview。
  2. 虚拟线程主要通过 Continuation 实现,虚拟线程栈会在切换的时候复制到 Continuation 中,切换回来的时候,再复制回来,但是不是每次都全量复制。在切换回来的时候,线程栈帧懒复制,调用返回到哪个就复制回哪个。这对于像是 servlet 这种很多层调用的是很大的优化,因为栈深度可能有 上百层,但是实际业务只会用到头部几层的场景的提升尤其明显。这样大大减少了切换的性能消耗。
  3. 网络 io 方面,虚拟线程目前完全不会阻塞了。
  4. 文件 io 方面,目前实现方式是遇到就增加一个平台线程来规避阻塞。这个会在 io_uring 引入到 JVM 支持后进行优化,到时候文件 io 也原生不会阻塞
  5. JFR,Thread Stack Dump,调试器, JVM TI 都可以兼容虚拟线程。但是要记住,调试虚拟线程可能也会让其他虚拟线程无法执行,因为载波线程是同一个。
  6. synchronized 以及涉及 ObjectMonitor 的,都还是会 pin 住载体平台线程,要在你的代码中避免使用
  7. 虚拟线程无法 getAllThreads(),这个方法返回的是所有平台线程。
  8. 所有 JMX 以及 java.lang.management 相关的都是处理平台线程,不支持 VirtualThread。
  9. 虚拟线程支持类似于 jstack 的 dump,但是命令有所不同,请通过 jcmd 获取。并且格式是 json,没有死锁信息(虚拟线程 dump 不会进入全局安全点STW所以无法获取一致性信息例如死锁等)

标签:Java21,复制,ThreadLocal,虚拟,线程,io
From: https://www.cnblogs.com/JaxYoun/p/17699671.html

相关文章

  • Java多线程____Executors线程池的使用和架构原理
    1.线程池API类型1.创建一个可重用固定线程数的线程池packagecom.frame.base.thread;importjava.util.concurrent.Executors;importjava.util.concurrent.ExecutorService;/***Java线程:线程池*@authorAdministrator*/publicclassTestExecutors{ publicstati......
  • Java多线程____线程死锁例子
    1:两个任务以相反的顺序申请两个锁,死锁就可能出现2:线程T1获得锁L1,线程T2获得锁L2,然后T1申请获得锁L2,同时T2申请获得锁L1,此时两个线程将要永久阻塞,死锁出现packagecom.zs.test; publicclassDeadLock{ publicstaticStringobjA="objA"; publicstaticStringobjB="ob......
  • Java多线程____生产者与消费者模型
    1.仓库类__:入库和出库的集合 有生产和出货方法packagecom.test.thread;importjava.util.LinkedList;/***@authorAdministrator*仓库类*/publicclassStorage{ //存储集合 privateLinkedList<Object>list=newLinkedList<Object>(); publicvoidruk......
  • Java多线程____线程yield方法介绍
    packagecom.test.thread;publicclassTestYield{ publicstaticvoidmain(String[]args){ TestThreadt1=newTestThread("A_01"); TestThreadt2=newTestThread("B_02"); t1.start(); t2.start(); }}classTestThreadextend......
  • Java多线程____线程状态Join()方法
    代码:packagecom.test.thread;publicclassTestRunnableimplementsRunnable{ @Override publicvoidrun(){ synchronized(this){ for(inti=0;i<10;i++){ System.out.println(Thread.currentThread().getName()); } } } }packagecom......
  • Java多线程____线程状态Sleep()方法
    Sleep():在指定的毫秒数内让当前正在执行的线程休眠调用sleep方法时使当前的线程进入休眠状态(阻塞状态)设定休眠xxxx毫秒数后进入运行状态同步块中的Sleep方法调用不会释放对象锁但调用wait()方法会释放对象的同步锁packagecom.test.thread;publicclassTestRunnableimpleme......
  • Java多线程____线程状态变化
    1.初始化状态 :和其他对象一样线程对象被创建初始化中2.可运行状态:也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程 3. 运行状态(Running) :线程获取CPU权限进行执行。需要注意的是,线程只能从就绪状态进入到运行状态。4.......
  • Java多线程____一个简单的多线程demo
    1.实现runnable接口实现功能性解耦 packagecom.test.thread;publicclassTestRunnableimplementsRunnable{ @Override publicvoidrun(){ for(inti=0;i<20;i++){ System.out.println(Thread.currentThread().getName()); } }}packagecom.test.thre......
  • Java多线程____BlockingQueue阻塞队列使用
    packagecom.frame.base.thread;importjava.util.concurrent.BlockingQueue;importjava.util.concurrent.ArrayBlockingQueue;/***并发编程____阻塞队列*/publicclassBlockingQueueTest{ publicstaticvoidmain(String[]args)throwsInterruptedException{......
  • Java多线程____JUC并发锁机制
    1.同步锁即通过synchronized关键字来进行同步,实现对竞争资源的互斥访问的锁。同步锁的原理是,对于每一个对象,有且仅有一个同步锁;不同的线程能共同访问该同步锁但是,在同一个时间点,该同步锁能且只能被一个线程获取到。这样,获取到同步锁的线程就能进行CPU调度,从而在CPU上执行;而没有获......