# 多线程学习笔记 **Repository Path**: JimmyCoding/threadLearning ## Basic Information - **Project Name**: 多线程学习笔记 - **Description**: 多线程学习笔记 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2018-06-28 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 多线程学习笔记 ## 项目介绍 java多线程学习 ## 学习大纲 ### 什么是多线程、多线程优缺点 √ ### 第一个简单的多线程例子 √ ### 线程同步的方法、线程间的通信 √ wait() notify() notifyAll() lock.newCondition().await() 和 signal() 方法 ### 多线程下的异常捕捉 √ 多线程的异常处理方法,实现接口UncaughtExceptionHandler,给线程设置对应的异常捕捉器即可在主线程中获取到线程中出现的异常 ### 多线程事务处理 基于spring事务处理,根据异常捕捉手动抛出异常 ### ThreadLocal √ ### 原子类 ### 高级线程类 CountDownLatch > 计数功能的,可以让线程计数中的线程执行完成后在执行其他操作,例如解析一个excel的数据,为了更快的解析则每个sheet都使用一个线程去进行解析,但是最后的汇总数据的工作则需要等待每个sheet的解析工作完成之后才能进行。但是只能使用一次我,无法重用。 构造方法: ``` CountDownLatch(int count) ``` 主要方法: ``` public void await() throws InterruptedException { }; //调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行 public boolean await(long timeout, TimeUnit unit) throws InterruptedException { }; //和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行 public void countDown() { }; //将count值减1 ``` CyclicBarrier > 让一组线程到达一个叫同步点时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。 构造方法: ``` public int await() throws InterruptedException, BrokenBarrierException { }; public int await(long timeout, TimeUnit unit)throws InterruptedException,BrokenBarrierException,TimeoutException { };// 让线程等待至一定的时间,如果还有线程没有到达barrier状态就直接让到达barrier的线程执行后续任务 ``` 主要方法: ``` int await() int await(long timeout, TimeUnit unit) boolean isBroken() ``` Semaphore > 可以控同时访问的线程个数,通过acquire() 获取一个许可,如果没有就等待,而release()释放一个许可。 构造方法: ``` public Semaphore(int permits) { //参数permits表示许可数目,即同时可以允许多少线程进行访问 sync = new NonfairSync(permits); } public Semaphore(int permits, boolean fair) { //这个多了一个参数fair表示是否是公平的,即等待时间越久的越先获取许可 sync = (fair)? new FairSync(permits) : new NonfairSync(permits); } ``` 主要方法: ``` public void acquire() throws InterruptedException { } //获取一个许可 public void acquire(int permits) throws InterruptedException { } //获取permits个许可 public void release() { } //释放一个许可 public void release(int permits) { } //释放permits个许可 ``` Phaser(略,没记起来) BlockingQueue > 阻塞队列 核心方法 ``` offer(anObject):表示如果可能的话,将anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则返回false.(本方法不阻塞当前执行方法的线程) offer(E o, long timeout, TimeUnit unit),可以设定等待的时间,如果在指定的时间内,还不能往队列中加入BlockingQueue,则返回失败。 put(anObject):把anObject加到BlockingQueue里,如果BlockQueue没有空间,则调用此方法的线程被阻断直到BlockingQueue里面有空间再继续. poll(time):取走BlockingQueue里排在首位的对象,若不能立即取出,则可以等time参数规定的时间,取不到时返回null; poll(long timeout,TimeUnitunit):从BlockingQueue取出一个队首的对象,如果在指定时间内,队列一旦有数据可取,则立即返回队列中的数据。否则知道时间超时还没有数据可取,返回失败。 ake():取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到BlockingQueue有新的数据被加入; drainTo():一次性从BlockingQueue获取所有可用的数据对象(还可以指定获取数据的个数),通过该方法,可以提升获取数据效率;不需要多次分批加锁或释放锁。 ``` ### 线程池 ExcutorService ThreadPoolExcutor ## 项目实战 实现一个抢单池功能 ## 带着问题学习 1、synchronized 的实现原理以及锁优化? 2、volatile 的实现原理? 3、Java 的信号灯? 4、synchronized 在静态方法和普通方法的区别? 5、怎么实现所有线程在等待某个事件的发生才会去执行? 6、CAS?CAS 有什么缺陷,如何解决? 7、synchronized 和 lock 有什么区别? 8、Hashtable 是怎么加锁的 ? 9、HashMap 的并发问题? 10、ConcurrenHashMap 介绍?1.8 中为什么要用红黑树? 11、AQS 12、如何检测死锁?怎么预防死锁? 13、Java 内存模型? 14、如何保证多线程下 i++ 结果正确? 15、线程池的种类,区别和使用场景? 16、分析线程池的实现原理和线程的调度过程? 17、线程池如何调优,最大数目如何确认? 18、ThreadLocal原理,用的时候需要注意什么? 19、CountDownLatch 和 CyclicBarrier 的用法,以及相互之间的差别? 20、LockSupport工具 21、Condition接口及其实现原理 22、Fork/Join框架的理解 23、分段锁的原理,锁力度减小的思考 24、八种阻塞队列以及各个阻塞队列的特性 #### 软件架构 软件架构说明 #### 安装教程 1. xxxx 2. xxxx 3. xxxx #### 使用说明 1. xxxx 2. xxxx 3. xxxx #### 参与贡献 1. Fork 本项目 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 码云特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目 5. 码云官方提供的使用手册 [http://git.mydoc.io/](http://git.mydoc.io/) 6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)