Java多线程大全
文章目录
- 简介
- 多线程使用场景
- 后台任务:
- 多线程的基本概念
- Java程序是如何运行的?
- 线程的创建和启动
- 1、线程的创建和启动
- 1.1、继承Thread类
- 1.2、实现Runnable接口
- 2、线程的调度与控制
- 2.1、线程优先级
- 2.2、Thread.sleep
- 3、Thread中几个方法、属性
- 3.1、wait、notify、notifyAll
- 3.2、yield
- 3.3、join
- 3.4、interrupt、isInterrupted
- Callable、Future
- 为什么使用Callable?
- 1、Callable
- 2、Runnable VS Callable
- 3、执行机制
- 4、异常处理
- 5、ExecutorService
- 6、Future
- 7、FutureTask
- 8、总结
- CompletableFuture
- 一、创建异步任务
- 1、Future.submit
- 2、supplyAsync / runAsync
- 二、异步回调
- 1、thenApply / thenApplyAsync
- 2、thenAccept / thenRun
- 3、exceptionally
- 4、whenComplete
- 5、handle
- 三、组合处理
- 1、thenCombine / thenAcceptBoth / runAfterBoth
- 2、applyToEither / acceptEither / runAfterEither
- 3、thenCompose
- 4、allOf / anyOf
- 线程池
- 前言
- 线程池实现原理
- 创建线程池的几种方式
- 1、newFixedThreadPool
- 2、newCachedThreadPool
- 3、newScheduledThreadPool
- 4、newSingleThreadExecutor
- 5、newSingleThreadScheduledExecutor
- 6、newWorkStealingPool
- 线程组和线程池的区别
- 线程组
- ThreadGroup
- ForkJoinPool 分支/合并框架
- 一、Fork/Join框架简介
- 二、Fork/Join 框架与线程池的区别
- 三、示例代码
- 线程的生命周期
- 线程的生命周期(面试问的多)
- 多线程辅助类
- 1、CountDownLatch
- 1、例子:
- 2、例子
- 2、CyclicBarrier
- 1、例子
- 2、例子
- 3、例子
- 4、例子
- 5、场景案例
- 总结:
- 3、Semaphore
- 1、Semaphore是什么
- 2、应用场景
- 3、例子
- 总结:
- ThreadLocal
- ThreadLocal
- ThreadLocal 的作用
- ThreadLocal的应用场景
- 使用案例
- 线程的同步(加锁)
- 1、为什么需要同步
- 2、synchronized
- 3、volatile
- 4、解决线程安全问题
- 5、Java多线程之死锁的出现和解决方法
- 1、什么是死锁?
- 2、synchronized嵌套
- 3、死锁出现的原因
- 4、死锁的解决方法
- 4.1、Synchronized
- 1、可重入
- 2、使用案例
- 3、可重入案例
- 4.2、ReentrantLock
- 1、trylock
- 2、lockInterruptibly
- 4.3、ReadWriteLock
- 小结:
- 4.4、ReentrantReadWriteLock
- 4.5、LockSupport
- 1、有什么用
- 2、Object的和LockSupport对比
- 3、总结
- 4.6、StampedLock
- 4.7、Condition
- 使用Object的wait()和notify()实现:
- 使用Condition实现
- 锁的分类
- 1、公平锁/非公平锁
- 2、可重入锁
- 模拟不可重入锁
- 模拟可重入锁
- 总结
- 3、独享锁/共享锁
- 4、互斥锁/读写锁
- 5、乐观锁/悲观锁
- 6、分段锁
- 7、自旋锁
- 8、偏向锁/轻量级锁/重量级锁
- 存在目的【Synchronized锁膨胀过程】
- 偏向锁
- 轻量级
- 重量级锁
- Atomic包
- 原子操作类简介
- 只保证原子性
- juc.atomic子包的结构层次
- 原子更新基本类型
- 常用方法
- AtomicInteger
- AtomicIntegerArray
- 常用方法
- 原子更新引用类型
- 常用方法
- AtomicReference使用实例
- 原子更新字段类型
- 常用方法
- AtomicIntegerFieldUpdater使用实例
- 总结
- synchronized锁膨胀
- 从偏向锁到重量级锁
- 锁对象
- 偏向锁
- 那么,什么是偏向锁?
- 锁膨胀
- 锁撤销
- 轻量级锁
- 自旋锁
- 自适应自旋锁
- 重量级锁
- 为什么说重量级锁开销大呢
- 总结
- 性能测试
- 在线制作折线图
- 针对synchronized和ReentrantLock
- 结论
- 通过OpenJDK分析synchronized
- 为什么要使用OpenJDK?
- OpenJDK官网
- GitHub地址
- 下载JDK11
- 解压目录结构
- synchronized的相关代码位置
- 简单分析
- 总结
- 源码深入分析
- 锁膨胀解决方案
- Synchronized会发生锁膨胀,改用Lock
- Synchronized 和 Lock 的主要区别
- ReentrantLock
- AQS
- 1、AQS原理
- 2、AQS的核心思想
- 3、模拟可重入锁和不可重入锁
- 模拟不可重入锁
- 模拟可重入锁
- 总结
- 借助ReentrantLock分析AQS
- 创建ReentrantLock
- ReentrantLock默认构造参数
- 第一个线程进来获取锁
- 第二个线程进来获取锁
- 释放锁并且唤醒其他线程
- 释放锁【队列中没有其他线程等待锁】
- CAS
- 一、什么是CAS
- 二、CAS的目的
- 三、CAS存在的问题
- 四、concurrent包的实现
简介
多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理” 。
多线程使用场景
后台任务:
-
如定时向大量(100W以上)的用户发送邮件
-
定期更新配置文件
-
任务调度(如quartz)
-
一些监控用于定期信息采集
-
自动作业处理:比如定期备份日志、定期备份数据库。
-
异步处理:如发微博、记录日志。
-
页面异步处理:比如大批量数据的核对工作(有10万个手机号码,核对哪些是已有用户)。
-
数据库的数据分析(待分析的数据太多),数据迁移。
多线程的基本概念
串行/同步:一个一个执行
异步:一起执行