java理论知识汇总-并发篇

关于原子类

原子类思维导图

AtomicStampedReference为什么能解决ABA问题

  • 引入了版本号的概念,将A->B->A转变为了 A1->B1->A2
  • CAS第二步比较时,由于A2不等于A1,返回了false。

关于线程

思维导图

画出线程状态图

线程状态图.png

interrupt, isInterrupted, interrupted的区别

方法 说明
interrupt 仅仅是设置线程的中断状态,并不会真正中断一个线程
isInterrupted 返回线程的中断状态,不清除标志位
interrupted 返回线程的中断状态,并清除标志位

哪些方法会处理中断状态

阻塞库方法如wait(),sleep(),join()在阻塞时一直检查中断状态,若检测到标志位置为true,则抛出InterruptedException,并清除中断状态。

wait,yield,sleep,join的区别

方法名 执行后线程状态 释放CPU资源 释放锁 其他
sleep 堵塞 给其他线程运行机会时不考虑线程的优先级
wait 堵塞 必须在 synchronized 修饰的代码块中使用
yield 就绪 释放 只能使同优先级或更高优先级的线程有执行的机会
join 堵塞 等待异步线程执行完结果之后才能继续运行

Callable、Runnable的异同

  • Callable可以获得返回值,Runnable没有
  • Callable可以抛出异常,Runnable需要通过setDefaultUncaughtExceptionHandler()方法实现

RecursiveTask和RecursiveAction

  • 都继承与ForkJoinTask,RecursiveTask有返回值,RecursiveAction无返回值

如何理解CompletableFuture

  • 实现了Future,是个让Runnable任务返回结果的有用工具。

如何理解FutureTask

  • 既实现了Runnable、也实现了Future,既是线程任务也是一个线程返回结果

关于线程池

线程池思维导图

画出线程池的状态图

线程池的五种状态设计.png

线程池接收新的任务的处理流程

  1. 线程数小于核心线程数时,创建新线程;
  2. 缓存队列未满时,加入缓存队列;
  3. 缓存队列满时,创建新线程;
  4. 缓存队列满且线程已经达到最大线程数时,执行拒绝策略;

线程池的数据模型

  • ctl前3位表示状态,后29位表示线程数
  • HashSet<Worker> workers 工作线程

线程池工作线程的数据模型

  • Worker实现了Runable且持有Runnable属性
  • 线程池在用户定义的任务上封装了一层,当线程thread启动时,会调用Worker的run()方法,内部执行用户定义的任务。

Executors类提供的线程池比较

| 线程池 | 实际线程池类 |说明 | 核心线程数| 最大线程数| 空闲存活时间| 任务队列 |
| newCachedThreadPool | ThreadPoolExecutor | 缓存线程池 | 0 | 无限 | 60秒 | SynchronousQueue |
| newFixedThreadPool | ThreadPoolExecutor | 固定线程池 | n | n | 0 | LinkedBlockingQueue |
| newScheduledThreadPool | ThreadPoolExecutor | 定时线程池 | n | 无限 | 0 | DelayedWorkQueue |
| newSingleThreadExecutor | ThreadPoolExecutor | 串行线程池 | 1 | 1 | 0 | LinkedBlockingQueue |
| newWorkStealingPool | ForkJoinPool | Fork-Join线程池 | cpu数 | - | - | WorkQueue |
ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。 ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常。 ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务 ThreadPoolExecutor.CallerRunsPolicy:由调用线程(提交任务的线程)处理该任务

四种拒绝策略

  • AbortPolicy:丢弃任务,并抛出异常
  • DiscardPolicy:丢弃任务,不抛出异常
  • DiscardOldestPolicy:丢弃最早的任务,
  • CallerRunsPolicy:直接在添加任务的线程执行。

ForkJoinPool 的原理

  • 分而治之的思想,内部使用“工作窃取”算法,让任务在各个CPU上尽可能均衡
  • 每个工作线程都有自己的工作队列
  • 工作队列为线程私有的双端队列
  • fork的子任务,将放入运行该任务的工作线程的队头,以LIFO的顺序来处理工作队列中的任务
  • 空闲线程会从其他线程的队列尾部窃取任务

关于ThreadLocal

ThreadLocal 原理

  • 获取当前线程的ThreadLocalMap属性
  • ThreadLocal对象作为key,从ThreadLocalMap获取值

ThreadLocalMap 的 key 为什么是 weakReference 弱引用类型

  • 当 key 没有 threadLocal 强引用时,GC 时就能够被回收
  • 虽然key会被回收但是value不会被回收,当下一次调用ThreadLocalMap的方式时,它会主动删除key为null的Entry
  • 综上,设计成弱引用类型只是多了一层保障,并不能完全避免内存泄露

ThreadLocal 内存泄漏

关于InheritableThreadLocal

  • thread类中有InheritableThreadLocalMap属性,用于存放父线程的本地线程变量
  • 主要用于解决父子线程的本地线程变量的继承问题

关于TransmittableThreadLocal(TTL)

  • 封装了一个线程池
  • 当该线程池调用execute方法时,自定义的线程任务+TransmittableThreadLocal和对应的线程变量一起封装成新的线程任务
  • 当该线程池中线程执行该线程任务时,先取出其中封装的本地线程变量加入到该线程的InheritableThreadLocalMap中。
  • 能够解决线程池中线程继承添加任务线程的线程本地变量的问题

ThreadLocalMap关键知识点

  • hash冲突时,采用的是线性探测法,试探i+1个槽位是否可以存放
  • ThreadLocal需要显性调用remove,一方面避免内存泄漏,另一方面由于线程大多数都是共用的,容易导致数据错乱
  • key 为什么是 weakReference 弱引用类型,当没有 threadLocal 强引用时,第一次GC 就能够被回收
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容