目录
一、快速认识线程
(1)主要讲述线程的运行,调用start()函数和重写Runnable接口(实际都是调用start()从而调用jni层的start0())。
(2)介绍了模板模式和策略模式。
其中,模板模式是通过设定包裹的模板,让指定步骤在运行前后执行;
策略模式则是满足了六大原则中的依赖倒置原则,具体依赖抽象,通过在高层设置抽象类,实现管理和业务逻辑的分离。
二、Thread的构造
(1)Thread构造分为带ThreadGroup和不带,不带的话默认是父线程的ThreadGroup,因为是父线程创建子线程这种方式的。
(2)虚拟机栈线程私有,可以用jvm的xss调整大小,影响迭代深度。进程内存空间约等于:堆内存+线程数 * 栈内存。
(3)守护线程,在其他非守护线程运行完毕才结束jvm。
三、Thread的Api
(1)方法:
sleep、yield两个方法,其中sleep是将线程由Running状态转换成TIMED_WAITING状态,yield是从Running状态转换成Runnable状态。不过sleep不会放弃monitor锁的所有权。
join()阻塞当前的线程,优先执行加入的线程
interupt()\interupted\isInterupted:其中interuptted会擦除标记,必须下次调用interupted()才可以恢复。
其他:getId()\getName()\getPriority()\currentThread()等方法,且优先级:线程优先级不会超过线程组的优先级
(2)java里的checked异常和unchecked异常,实际上checked异常就是指的编译时异常(如io),而unchecked异常则是指的error以及运行时异常
(3)线程的退出包括:a.正常退出;b.interrupt捕捉中断后退出(线程中执行可中断方法+volatile开关控制防止擦除);c.异常退出,由于不允许抛出checked异常(编译时抛出),所以要封装为unchecked异常抛出
https://github.com/metheway/highconcurrency/tree/main/src/thread_api
四、线程安全与线程同步
介绍了synchronized底层用monitor实现,刷入主内存防并行执行。另外介绍了类锁和对象锁的区别,实际上类锁也就是利用了类唯一性的特征来进行加锁。
五、线程间通信
八、线程池原理以及自定义线程池
单纯的类关系图、序列图实际并不能简洁表示各个类的职责和关系,因为往往抽象类之间的关系才足够体现设计思想。线程池要实现的功能主要是:1、线程工厂;2、任务队列;3、线程数量管理;4、拒绝策略;5、队列尺寸控制防溢出;6、keepalive时间
1、设计的思想:主要类有ThreadPool负责:提供线程池的调用和设置;TaskQueue主要负责
十四、单例模式
饿汉式是提前加载,占内存、记得加final;
懒汉式是运行时加载、省内存,但要加锁才能保证多线程单例;
双重检查锁是为了保证多线程单例,在懒汉式同步前加判断,同时为了防止指令重排序造成非单例乃至构造时对象实例化并行运行报错而用volatile关键字;
静态类获取可以用内部类的方式获取实例,利用了类加载,保证了只在用时实例化、同时是同步的方法实例化,保证了多线程单例;
通过静态内部类利用类(枚举)加载+枚举利用底层线程安全,可以同时保证多线程单例且防反射篡改。
https://github.com/metheway/highconcurrency/tree/main/src/singleinstance
十五、监控任务的生命周期
一个有生命周期回调的线程模式,设置全局任务,在线程中运行,并且设置运行的生命周期函数开始-运行-结束-错误等等。每次运行都需要进行回调。
https://github.com/metheway/highconcurrency/tree/main/src/observablethread
十六、单线程执行
二十八、Event Bus的设计模式
二十九、Event Driven的设计模式
总结
以上是我阅读Java高并发编程详解的总结。