多线程
文章平均质量分 73
多线程
yygr
这个作者很懒,什么都没留下…
展开
-
计划任务线程池ScheduledThreadPoolExecutor原理
根据对象、执行时间等入参,创建对象,将一个普通的对象包装计划任务调用方法,把这个包装好的任务放入队列中,如果有需要的话,为线程池创建新的工作线程在提交任务中,线程池做的事情十分简单,无非是创建任务、放入队列提交任务以后,线程池中存活的工作线程worker就可以从工作队列workQueue// 计划线程池ScheduledThreadPoolExecutor 是 线程池ThreadPoolExecutor 的子类// ...= null) {// ...task.run();// ...转载 2024-07-04 14:55:52 · 76 阅读 · 0 评论 -
为什么线程切换会导致用户态与内核态的切换?
CPU通过分配时间片来执行任务,当一个任务的时间片用完,就会切换到另一个任务。在切换之前会保存上一个任务的状态,当下次再切换到该任务,就会加载这个状态。——任务从保存到再加载的过程就是一次上下文切换。自发性上下文切换非自发性上下文切换自发性上下文切换指线程由于自身因素导致的切出。通过调用下列方法会导致自发性上下文切换:非自发性上下文切换指线程由于线程调度器的原因被迫切出。发生下列情况可能导致非自发性上下文切换:切出线程的时间片用完。转载 2022-09-23 09:56:58 · 1486 阅读 · 0 评论 -
java子线程中获取父线程的threadLocal中的值
我们都知道线程本地变量表也就是ThreadLocal在我们做线程级的数据隔离时非常好用,但是有时候我们会想如何让子线程获取到父线程的ThreadLocal,其实在线程中除了ThreadLocal外还有InheritableThreadLocal,顾名思义,可继承的线程变量表,可以让子线程获取到父线程中ThreadLocal的值。如果允许new的线程继承当前线程的threadlocalMap,那么new的线程会copy一份当前线程也就是父线程的inheritableThreadLocals。转载 2022-09-16 12:06:11 · 1329 阅读 · 0 评论 -
什么是多线程的上下文切换,有什么影响?如何进行优化
1.什么是CPU时间片?CPU会给每个线程分配执行的时间,也就是CPU时间片CPU时间片是一个小的时间单位,一般为几十毫秒当线程用完分给它的时间片后,系统的计时器发出时钟中断,调度程序便停止该线程的运行,把它放入就绪队列的末尾;然后把CPU分给其他就绪的线程,同样也让它运行一个时间片,如此往复。2.什么是线程上下文切换?对于CPU而言,在一个时刻只能运行一个线程,当一个线程的时间片用完,或者因自身原因被迫暂停运行,此时另一个线程会被操作系统选中来占用处理器。......转载 2022-08-16 12:50:05 · 784 阅读 · 0 评论 -
join()、park()、yield()会不会释放当前线程持有的锁?
stop()、suspend()、Thread.sleep()都不会释放线程所持有的锁。但join()、park()、yield()会不会释放当前线程持有的锁?下面通过一些实例来验证一下。运行结果可以自定粘贴运行,结论如下。转载 2022-08-16 12:45:22 · 767 阅读 · 0 评论 -
Synchronized优化手段:锁膨胀、锁消除、锁粗化和自适应自旋锁
本文我们介绍了 4 种优化 synchronized 的方案,其中锁膨胀和自适应自旋锁是 synchronized 关键字自身的优化实现,而锁消除和锁粗化是 JVM 虚拟机对 synchronized 提供的优化方案,这些优化方案最终使得 synchronized 的性能得到了大幅的提升,也让它在并发编程中占据了一席之地。...转载 2022-08-15 16:47:27 · 232 阅读 · 0 评论 -
java线程数设置和系统cpu的关系
这里的cpu个数不是指系统的cpu总个数,也不是指cpu总核心数,而是指cpu的总逻辑处理单元即超线程的个数。IO密集型程序(如数据库数据交互、文件上传下载、网络数据传输等等)设置线程数为2倍的总逻辑处理单元个数。计算密集型程序(如数据转换,递归,复杂算法,加解密程序)设置线程数为总逻辑处理单元个数+1。总逻辑CPU数 = 物理CPU个数 * 每颗物理CPU的核数 * 超线程数;CPU总核数 = 物理CPU个数 * 每颗物理CPU的核数;一般,总核心数=总逻辑CPU数/2。# 查看逻辑CPU的个数。...转载 2022-08-15 16:19:48 · 1211 阅读 · 0 评论 -
scheduleAtFixedRate和scheduleWithFixedDelay 区别
scheduleAtFixedRate ,中文意思为 以固定比率执行,参数有 Runnable command, long initialDelay,long period,TimeUnit unit 第1次执行的时间是initialDelay(unit),第2次执行的时间是initialDelay+period(unit),第3次执行的时间是initialDelay+period*2(unit),依次类推。也就是,在任务开始后,period时间后,便会执行下一次任务。...转载 2022-08-15 15:58:02 · 894 阅读 · 0 评论 -
Juc12_Volatile的可见性、不保证可见性、有序性、使用、内存屏障四大指令StoreStore、StoreLoad 、LoadLoad、LoadStore
https://tangzhi.blog.csdn.net/article/details/117601980?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-117601980-blog-123595503.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant转载 2022-06-26 20:52:32 · 490 阅读 · 0 评论 -
volatile怎么通过内存屏障保证可见性和有序性?
https://blog.csdn.net/chenzengnian123/article/details/122406807小陈:老王,你上一篇抛出一个问题volatile怎么通过内存屏障保证可见性和有序性?我现在迫不及待的想知道了。老王:嗯嗯,我们慢慢来讲,先说说volatile怎么通过内存屏障来保证可见性?小陈:volatile关键字实际上是怎么使用内存屏障的呢?老王:是这样子的。volatile修饰的变量,在每个读操作(load操作)之前都加上Load屏障,强制从主内存读取最新的数据。每次在assi转载 2022-06-25 16:40:28 · 297 阅读 · 0 评论 -
Java8新的异步编程方式 CompletableFuture(一)
https://www.jianshu.com/p/dff9063e1ab6JDK 5引入了Future模式。Future接口是Java多线程Future模式的实现,在java.util.concurrent包中,可以来进行异步计算。Future模式是多线程设计常用的一种设计模式。Future模式可以理解成:我有一个任务,提交给了Future,Future替我完成这个任务。期间我自己可以去做任何想做的事情。一段时间之后,我就便可以从Future那儿取出结果。Future的接口很简单,只有五个方法。Fu转载 2022-06-09 15:41:41 · 451 阅读 · 0 评论 -
阻塞队列的综合体LinkedTransferQueue
https://baijiahao.baidu.com/s?id=1678542622768817884&wfr=spider&for=pcLinkedTransferQueue在某些实现可以看作是ConcurrentLinkedQueue、SynchronousQueue、LinkedBlockingQueue的超集,可以作为一个对比学习。LinkedTransferQueue简介LinkedTransferQueue是一个由链表结构组成的无界阻塞队列,它实现了Transf转载 2022-05-27 14:29:55 · 100 阅读 · 0 评论 -
工作窃取算法 work-stealing
https://blog.csdn.net/pange1991/article/details/80944797工作窃取(work-stealing)算法是指某个线程从其他队列里窃取任务来执行。一个大任务分割为若干个互不依赖的子任务,为了减少线程间的竞争,把这些子任务分别放到不同的队列里,并未每个队列创建一个单独的线程来执行队列里的任务,线程和队列一一对应。比如线程1负责处理1队列里的任务,2线程负责2队列的。但是有的线程会先把自己队列里的任务干完,而其他线程对应的队列里还有任务待处理。干完活转载 2022-05-27 11:51:19 · 961 阅读 · 0 评论 -
aqs中关于propagate状态的思考
https://blog.csdn.net/cq_pf/article/details/113387256?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-113387256-blog-110535122.pc_relevant_default&spm=1001.2101.3001.4242.1&utm_relevant_index=2之前分析过转载 2022-05-23 14:25:23 · 570 阅读 · 0 评论 -
面试官问我AQS中的PROPAGATE有什么用?
https://blog.csdn.net/zy353003874/article/details/110535122之前分析过AQS的源码,但只分析了独占锁的原理。而刚好我们可以借助Semaphore来分析共享锁。如何使用Semaphorepublic class SemaphoreDemo { public static void main(String[] args) { // 申请共享锁数量 Semaphore sp = new Semaphore(...转载 2022-05-23 14:20:19 · 750 阅读 · 2 评论 -
Java 读写锁 ReentrantReadWriteLock 源码分析
https://blog.csdn.net/weixin_43785662/article/details/122185457本文内容:读写锁 ReentrantReadWriteLock 的源码分析,基于 Java7/Java8。阅读建议:虽然我这里会介绍一些 AQS 的知识,不过如果你完全不了解 AQS,看本文就有点吃力了。目录使用示例下面这个例子非常实用,我是 javadoc 的搬运工:// 这是一个关于缓存操作的故事class CachedData { Obj..转载 2022-05-22 15:30:31 · 194 阅读 · 0 评论 -
探究ThreadLocal内存泄漏及弱引用
https://blog.csdn.net/xiaoxiaodaxiake/article/details/107750888第一、前言有些程序员在使用ThreadLocal的过程中会发现有内存泄漏的情况,就猜测这个内存泄漏与Entry中使用了弱引用的key有关系。第二、内存泄漏的相关概念1.Memory overflow:内存溢出是没有足够的内存提供申请者使用。2.Memory leak:内存泄漏是指程序中已动态分配的内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度转载 2022-05-21 13:12:52 · 580 阅读 · 0 评论 -
ThreadLocalMap线性探测法解决hash冲突
https://blog.csdn.net/xiaoxiaodaxiake/article/details/107750888第一、前言ThreadLocal使用的是自定义的ThreadLocalMap,接下来我们来探究一下ThreadLocalMap的hash冲突解决方式。第二、ThreadLocal的set()方法public void set(T value) { Thread t = Thread.currentThread(); ThreadLocal.ThreadL转载 2022-05-21 13:02:47 · 1840 阅读 · 0 评论 -
多线程 漫画:聊聊线程池中,线程的增长/回收策略
https://blog.csdn.net/qq_29883183/article/details/115840141?utm_term=%E7%BA%BF%E7%A8%8B%E6%B1%A0%E6%98%AF%E5%85%AC%E5%B9%B3%E7%9A%84%E5%90%97&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduweb~default-0-115840141-null-null&a转载 2022-05-14 15:52:01 · 534 阅读 · 0 评论 -
ReentrantReadWriteLock源码解读
https://blog.csdn.net/weixin_38192427/article/details/117086335目录 ReentrantReadWriteLock 概述 ReentrantReadWriteLock 源码 源码概览 ReentrantReadWriteLock 中的 state 构造器 非公平模式(默认) 公平模式 写锁的获取转载 2022-04-27 10:29:58 · 315 阅读 · 0 评论 -
自旋锁类型详解
https://blog.csdn.net/qq_41723615/article/details/104348186什么是自旋锁多线程中,对共享资源进行访问,为了防止并发引起的相关问题,通常都是引入锁的机制来处理并发问题。获取到资源的线程A对这个资源加锁,其他线程比如B要访问这个资源首先要获得锁,而此时A持有这个资源的锁,只有等待线程A逻辑执行完,释放锁,这个时候B才能获取到资源的锁进而获取到该资源。这个过程中,A一直持有着资源的锁,那么没有获取到锁的其他线程比如B怎么办?通常就会有两种方转载 2022-04-26 07:36:03 · 909 阅读 · 0 评论 -
FutureTask中的putOrderedInt怎么理解?
https://www.zhihu.com/question/394805625问题:查看FutureTask源码:protected void set(V v) { if (UNSAFE.compareAndSwapInt(this, stateOffset, NEW, COMPLETING)) { outcome = v; UNSAFE.putOrderedInt(this, stateOffset, NORMAL);转载 2022-04-23 21:15:23 · 318 阅读 · 0 评论 -
java中任务的分而治之框架ForkJoin
https://baijiahao.baidu.com/s?id=1676005699841591091&wfr=spider&for=pc当一个任务在非常庞大的时候都会尝试拆分任务,而Java7中提供了一种任务拆分的框架ForkJoin。ForkJoin介绍ForkJoin框架是用来并行执行任务的框架,它可以把一个大任务分割成多个小任务,然后各个小任务去执行再把执行结果汇总在一起得到最终的结果,通过这种拆分实现多线程并行执行充分的利用CPU资源,提高程序的效率。Fork转载 2022-04-19 09:51:38 · 249 阅读 · 0 评论 -
Callable和Future用法解析
https://blog.csdn.net/weixin_44863537/article/details/113354411Callable和Future的关系 可以用Future.get来获取Callable接口返回的执行结果,还可以通过Future.isDone()来判断任务是否已经执行完了 在call()未执行完毕之前,调用get()的线程(假定此时是主线程)会被阻塞,直到call方法返回了结果后,此时future.get才会得到结果,然后主线程才会切换到runnable状态转载 2022-04-19 09:51:43 · 628 阅读 · 0 评论 -
深入理解CyclicBarrier原理
https://blog.csdn.net/qq_39241239/article/details/870301421、CyclicBarrier的简单概述现实生活中我们经常会遇到这样的情景,在进行某个活动前需要等待人全部都齐了才开始。例如吃饭时要等全家人都上座了才动筷子,旅游时要等全部人都到齐了才出发,比赛时要等运动员都上场后才开始。在JUC包中为我们提供了一个同步工具类能够很好的模拟这类场景,它就是CyclicBarrier类。利用CyclicBarrier类可以实现一组线程相互等待,当转载 2022-04-18 08:12:12 · 152 阅读 · 0 评论 -
juc中ArrayBlockingQueue为什么出入用同一个锁?
https://blog.csdn.net/qq_27007251/article/details/75207050昨天突然想到一个问题,为什么juc中ArrayBlockingQueue用一个锁(两个condition),而LinkedBlockingQueue用两个锁(两个condition)实现。这导致了后者可以一边取一边放,而前者不行。为了探究其设计的原因,产生了如下qa(自己和自己)Q:为什么ArrayBlockingQueue put和take不能并行?A:因为put转载 2022-04-17 11:02:48 · 484 阅读 · 0 评论 -
ConcurrentHashMap的源码分析-resizeStamp
https://blog.csdn.net/Leon_Jinhai_Sun/article/details/112062415这块逻辑要理解起来,也有一点复杂。resizeStamp用来生成一个和扩容有关的扩容戳,具体有什么作用呢?我们基于它的实现来做一个分析static final int resizeStamp(int n) { return Integer.numberOfLeadingZeros(n) | (1 << (RESIZE_STAMP_BITS - 1)); }转载 2022-04-01 09:20:36 · 335 阅读 · 0 评论 -
LongAdder类和AtomicLong的区别
https://www.jianshu.com/p/ee7c355f0193LongAdder有点类似于分段锁的概念,在进行add的时候,先会通过一次cas尝试添加。如果添加失败会通过cell将add数值添加到cell中。但是它自身的代码实现导致了它在并发情况下的精确度不高Atomic在并发竞争的时候,可能会造成多个线程竞争失败一直在重试,相比于LongAdder效率会比较低。但是精确。具体还是需要通过代码来分析。关于LongAdderLongAdder是JDK1.8引入到J.U.C转载 2022-03-31 14:50:21 · 198 阅读 · 0 评论 -
AtomicXXX 用得好好的,阿里为什么推荐使用 LongAdder?
https://blog.csdn.net/m0_63437643/article/details/123329597面试连环炮先来一连炮简单的面试,看你能顶住几轮?栈长:1、多线程情况下,进行数字累加(count++)要注意什么?张三:要注意给累加方法加同步锁,不然会出现变量可见性问题,变量值被其他线程覆盖出现不一致的情况栈长:2、保证变量的可见性,用 volatile 修饰不就行了吗?张三:volatile是可以保证可见性,但不能保证原子性和线.转载 2022-03-31 13:08:15 · 100 阅读 · 0 评论 -
JDK8系列之LongAdder解析
https://www.jianshu.com/p/ec045c38ef0c前言最近公司的项目在陆续升级jdk8,正好想起之前有人问我的jdk8中新增的LongAdder类和AtomicLong的区别,就忍不住想探究一番。源码解析首先看一下类的定义public class LongAdder extends Striped64 implements Serializable然后来看一下类的属性和方法LongAdder.png这里让我困惑的一个问题是LongA转载 2022-03-31 09:19:56 · 202 阅读 · 0 评论 -
CopyOnWriteArrayList的使用
CopyOnWriteArrayList - 简书CopyOnWriteArrayList 简介public class CopyOnWriteArrayList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { }在很多应用场景中,读操作可能会远远大于写操作。由于读操作根本不会修改原有的数据,因此如果每次读取都进行加锁操作,其实是一种资源浪费。我们应转载 2022-03-21 21:29:38 · 925 阅读 · 0 评论 -
CAS (多线程保证原子性)和处理器lock前缀指令详解
CAS (多线程保证原子性)_weixin_30708329的博客-CSDN博客概述CAS(Compare-and-Swap),即比较并替换,是一种实现并发算法时常用到的技术,Java并发包中的很多类都使用了CAS技术。CAS也是现在面试经常问的问题,本文将深入的介绍CAS的原理。案例介绍CAS之前,我们先来看一个例子。上面这个例子在volatile关键字详解文中用过,我们知道,运行完这段代码之后,并不会获得期望的结果,而且会发现每次运行程序,输出的结果都不一样,都是一个转载 2022-03-21 21:02:15 · 1735 阅读 · 0 评论 -
Java原子类中可以靠版本号比较为什么还需要CAS操作?以及ABA问题到底是什么?
https://www.zhihu.com/question/269109328问题最近面试面试官提到java原子类可以通过CAS保证操作的原子性,但缺点是产生了ABA问题,所以可通过版本号比较。那为什么不直接通过版本号比较呢? 这是一个问题,我还有一个疑惑就是ABA问题在什么情况下会造成影响,值一样不就行了吗。回答1的确可以只比较版本号,实际上一些外部KV存储的CAS经常就是只比较版本号的,但是你的目标并不是原子性地递增一个版本,而是原子性地在递增版本的同时设置值,保证这两个操作一起形成一个原子转载 2022-03-21 20:49:34 · 556 阅读 · 0 评论 -
如何优雅的关闭Java线程池
如何优雅的关闭Java线程池 - 清泉^_^ - 博客园面试中经常会问到,创建一个线程池需要哪些参数啊,线程池的工作原理啊,却很少会问到线程池如何安全关闭的。也正是因为大家不是很关注这块,即便是工作三四年的人,也会有因为线程池关闭不合理,导致应用无法正常stop的情况,还有出现一些报错的问题。本篇就以ThreadPoolExecutor为例,来介绍下如何优雅的关闭线程池。01 线程中断在介绍线程池关闭之前,先介绍下Thread的interrupt。在程序中,我们是不能随便中断一个转载 2022-03-19 12:58:48 · 986 阅读 · 0 评论 -
JAVA线程池原理源码解析—为什么启动一个线程池,提交一个任务后,Main方法不会退出?
JAVA线程池原理源码解析—为什么启动一个线程池,提交一个任务后,Main方法不会退出?_qq_43171869的博客-CSDN博客public static void main(String[] args) { ExecutorService service = Executors.newFixedThreadPool(10); service.submit(() -> System.out.println("Hello ")); ...转载 2022-03-19 12:29:44 · 729 阅读 · 0 评论 -
Java中的ThreadLocal通常是在什么情况下使用的?
https://www.zhihu.com/question/21709953ThreadLocal就是变量在不同线程上的副本,不同线程不共享,所以对变量改动时就不需要考虑线程间同步的问题了ThreadLocal在web应用开发中是一种很常见的技巧,当web端采用无状态写法时(比如stateless session bean和spring默认的singleton),就可以考虑把一些变量放在ThreadLocal中举个简单例子,以理解意思为主:你有两个方法A和B都要用到变量userId,又不想传来传去,一转载 2022-02-23 16:07:02 · 427 阅读 · 0 评论 -
Java线程同步和线程通信
https://www.cnblogs.com/549294286/p/3687722.html线程同步,利用锁机制解决线程安全问题线程通信,利用等待唤醒机制解决线程协调执行问题一、线程同步当多个线程访问同一个数据时,非常容易出现线程安全问题。这时候就需要用线程同步。不可变类总是线程安全的,因为它的对象状态是不可改变的,但可变类对象需要额外的方法来保证线程安全。1、同步监视器释放同步监视器的锁定任何线程进入同步代码块、同步方法之前,必须先获得对同步监视器的锁定,那么何时会释放对同步监视器锁定转载 2022-02-18 10:41:44 · 559 阅读 · 0 评论 -
JVM 源码分析:深入理解 park / unpark
https://blog.csdn.net/u013978512/article/details/120190996https://www.cnblogs.com/yonghengzh/p/14280670.html https://blog.csdn.net/u013978512/article/details/120011860?spm=1001.2014.3001.5501 这篇文章我们讲了AQS转载 2022-02-18 10:25:33 · 1258 阅读 · 0 评论 -
Object类的wait/notify和LockSupport(park/unpark)的区别
https://blog.csdn.net/weixin_37288522/article/details/103848244Object中的wait()和notify()使用注意事项:1、因为wait需释放锁,所以必须在synchronized中使用(没有锁时使用会抛出IllegalMonitorStateException)2、notify也要在synchronized使用,并且应该指定对象3、synchronized(),wait(),notify() 对象必须一致,一个synchroniz转载 2022-02-15 14:09:33 · 320 阅读 · 0 评论 -
Java AQS unparkSuccessor 方法中for循环为什么是从tail开始而不是head
https://blog.csdn.net/foxException/article/details/108917338 目录 1、前言2、尾部遍历源码3、高并发下入队逻辑3.1 原子性问题3.2 图解流程 4、结尾 1、前言 在AQS多线程竞争下的获取与释放流程转载 2022-02-14 20:33:04 · 532 阅读 · 2 评论