java 线程到线程池到锁 复习总结

复习计划第一课:hashMap 和 concurrentHashMap

花了一周才看完HashMap和ConcurrentHashMap和部分其他集合,对于我速成然后面试的想法打击颇大,花了三四天复习了线程和线程池还有锁方面的知识,后续打算挑些重点复习,先面试再说,不然复习完都秋天了。

有缺漏或不正确的地方,欢迎指正。

 

目录

线程

线程池

线程池类型

自定义线程池参数讲解和配置

锁的类型

volatile

synchronized

CAS

 AQS

java current包的锁


线程

源码和图解:线程状态说明和图解

 

线程池

线程池类型

图画的好系列:五个线程池的创建和区别

补充总结几个点:

  1. 默认线程池管理类Executors同样是1.5版本doug lea加的current包里的东东,本质上是对线程池ThreadPoolExecutor类的封装类。
  2. 我看的1.8版本是有六个默认线程池。
  3. 可以自己直接对ThreadPoolExecutor进行引用,配置自定义线程池,区别类似于吃饭你选择自己点单品,还是吃套餐。
  4. 源码不复杂,随便看看就懂了。就是doug lea写的工具类,继承多那么一点点,方法多那么一点点,写法多那么一点点,没啥特殊的(bushi

java 线程到线程池到锁 复习总结_第1张图片

 

自定义线程池参数讲解和配置

参数讲解细致系列:自定义线程池的参数讲解

配置讲解细致系列:自定义线程池的参数配置

又补充总结几个点:

  1. 小栗子:理发店员工5位(corePoolSize),老板1位(maximumPoolSize = 5+1 = 6)。正常来客人会让没起床的赶紧起床接客(线程小于corePoolSize时候,会新建线程),客人满了还来客,老板亲自上场(线程=6)。半个小时没人来了(keepAliceTime),老板又回去休息了。老板上次也来了贼多人,就一个个排队去,按队列的类型,有排三五个就不让排的(有界队列),有一直排下去的(无界队列),有让他们去隔壁理发店的(同步移交队列)。要是排三五个就不让排了。剩下的也有选择,1不接客,2叫他回去,3假装没看到,4让前面排队的走一个,他补上。
  2. 没啥补充,别人写的很好,线程池配置是如此,底层原理的可以源码继续跟进同时配合网上博客慢慢推进。

java 线程到线程池到锁 复习总结_第2张图片

 

锁的类型

头脑清晰系列:synchronized和lock区别及锁的类型

这个可以主要看文章后半段:锁的类型。

这里简单列下:

  1. 公平锁/非公平锁
  2. 可重入锁
  3. 独享锁/共享锁
  4. 互斥锁/读写锁
  5. 乐观锁/悲观锁
  6. 分段锁
  7. 偏向锁/轻量级锁/重量级锁
  8. 自旋锁

讲java的锁之前,需要先过几个基础。

 

volatile

细致入微系列:volatile原理

从修饰符到cup缓存,讲的太好了。

又又补充总结几个点:

  1. 说简单点,volatile能保证多线程之间某个参数一致性,原理就是,主内存里有所有内存数据,cpu拿了一部分热数据缓存在cpu里,只要是volatile修饰的变量,改的时候强制更新到主内存,而根据缓存一致性协议,其他cpu的数据在主内存被修改的情况,同步更新,达到读一致性。
  2. 虽然volatile i读保证是最新的,但不保证i++的一致性,所以volatile无法单独完成锁功能,只能保证读一致性。
  3. volatile是current的核心,也是并发的核心,比如AtomicInteger等原子类的变量修饰,AQS的state状态。大部分参与并发的类和包里面的变量,都使用了volatile做修饰。

 

synchronized

反编译小天才系列:synchronized

从里到外讲解了为啥这个synchronized,它就能在多线程里这么嚣张。

叒补充总结几个点:

  1. 它是底层推荐的安全锁,在ConcurrentHashMap中,无节点使用cas自旋,有节点使用synchronized就是它比较标准的使用。
  2. synchronized是很早就存在的隐式锁,后续也对它做了不同量级的优化。
  3. synchronized原理和优化简单点说,旧版本:带薪拉屎,一个坑位很多人用,synchronized就是那个坑位的门,有人在里面锁上了,就得等他出来才行。优化版本:(偏向锁)每次老油条A来蹲这个坑位,不用看有没有其他蹲坑人在里面,(轻量级锁)老油条B也来这个坑位,每次推一下厕所门(cas)看看有没有人就行。(重量级锁)坑位外面排了三五个人,都排队玩手机呢。

 

CAS

原理:cas原理和应用

叕补充总结几个点:

  1. cas是cup原子指令,java很多类的底层也是使用cas,同时它存在三个问题:1是ABA问题,2是自旋耗能问题,3是只能保证一个共享变量原子性问题。这些问题在java的使用中都有优化。
  2. cas简单来说,先对比,相等再修改。好比,老油条A去蹲坑,他需要检查下,他记忆中的坑,和现在的坑是不是相同,如果不同,那就是有其他老油条拉过且没冲干净,最好冲一下,重新进来检查。
  3. 这是一种解决方案的思路,适用于任何需要保证一致性的问题上,区别是怎么去使用和优化。

 

 AQS

原理:AQS简介

又叕补充总结几个点:

  1. 简单来说,用java建一个volatile修饰的int state去表示资源的状态(0和1,重入锁存在大于1),其他抢夺这个资源的线程没有拿到state=0的情况,就存在node对象组成的链表里。
  2. AQS是对原本synchronized僵硬不可拓展的特点,重新设计一个可拓展灵活的并发解决方案,代码实现了锁的更多属性和方法,适合拓展。
  3.  AQS是java为了解决并发问题的一种解决方案的思路,适用于任何需要保证一致性的问题上,区别是怎么去使用和优化。

java 线程到线程池到锁 复习总结_第3张图片

java 线程到线程池到锁 复习总结_第4张图片

 

java current包的锁

讲的很碎系列:可重入锁+lockSupport+AQS

1.8版本的锁有:

  1. CountDownLatch(数量减少锁)
  2. Semaphore(信号量)
  3. ReentrantLock(可冲入锁,上一课的ConcurrentHash1.8以前就是用的这个锁实现分段锁)
  4. ReentrantReadWriteLock(可重入读写锁)
  5. CyclicBarrier(循环屏障)
  6. StampedLock(有邮戳的锁,字面意思)

双叕补充总结几个点:

  1. 前四个锁直接使用了AQS,CyclicBarrier通过ReentrantLock实现AQS,StampedLock自己重写AQS结构。
  2. AQS本身和六个锁都是抽象类,锁使用AQS的方法是写内置类sync继承AbstractQueuedSynchronizer类。
  3. 比较容易拿来作对比的是CountDownLatch和CyclicBarrier,可以看这篇CyclicBarrier和CountDownLatch区别,用文章评论的话说,就是前者公交等人都上车才开车,后者等人都到齐才开门让大家上车。一个等事件,一个等线程。

å¨è¿éæå¥å¾çæè¿°

java 线程到线程池到锁 复习总结_第5张图片

java 线程到线程池到锁 复习总结_第6张图片

java 线程到线程池到锁 复习总结_第7张图片

 


PS:本质上不是一篇技术文章,而是复习笔记,不知道网上为什么没人整理一下,难倒是因为太简单了嘛,哎,菜鸡秃然失去自信。

我要我偷偷的学习,然后惊艳所有面试官!

你可能感兴趣的:(java,java,多线程)