3-java 高并发编程
2023-03-15 15:33:33 0 举报
AI智能生成
java 高并发学习笔记
作者其他创作
大纲/内容
心得
多线程的本质是压榨CPU性能
锁:竞争临界资源
线程同步和等待的方式
线程信息传递(ThreadLocal,同步容器,队列等)
线程池,线程的名称很重要
利用数组下标,或者同步容器 存储不同线程的执行结果
阅读源码的技巧
读源码
基础概念
进程
是计算机资源分配的基本单位
线程
CPU的基本调度单位,多个线程共享进程的资源
线程切换
纤程/协程
串行
并行 parallel
多任务同一时间执行处理
并发 concurrent
在同一时间提交任务
线程数多少合适
理论线程数 = CPU核数* 期望利用率*(1+ IO等待时间/计算密集时间)
用户态和内核态
Java 中的Thread
线程的状态
NEW: 创建一个 Thread 实例,尚未start.
RUNNABLE: 可运行状态。 start()
BLOCKED: 锁阻塞
WAITING: 没有时间的等待,需要手动唤醒
TIMED_WAITING: 有时间的等待,到时间自动唤醒。
TERMINATED: 线程终止
图示
线程的创建方式
继承Thread
实现 Runable 接口
实现 Callable 接口
线程的常用方法
currentThread() -- 获取当前线程
setName("子系统-模块-方法") -- 设置线程名称
setPriority(1) -- 设置优先级
Thread.yield() -- 让出时间片
Thread.sleep(1000) -- 休眠
join() -- 强制加入执行
wait, notify , notifyAll -- 阻塞和唤醒
interrupt() -- 标识打断状态。并不会真的打断线程,线程根据自己的业务,编写被打断的业务逻辑
优雅的关闭线程方式
volatile 修饰 布尔变量,用业务逻辑来控制线程关闭。
interrupt 和 interrupted 标识位来控制线程关闭。
并发的三大特性
原子性 automatic
synchronized
synchronized锁升级
普通对象 =》 偏向锁 =》轻量级锁(CAS 或者叫 无锁) =》重量级锁(核心态)
CAS
Lock锁
CAS 乐观锁 对比悲观锁
可见性
MESI协议
子主题
子主题
缓存行 Cache Line
验证缓存行的代码
volatile
synchronized 和 Lock:
ThreadLocal
强软弱虚
强引用:
软引用SoftReference:(可以做缓存用)
配图
弱引用 WeakReference
虚引用 PhantomReference
内存泄漏问题
配图,虚线代表弱引用
有序性
as-if-serial
JVM
一个对象在内存中的结构
markword
标记描述,包括hashcode信息,锁信息,GC信息。(属于对象头信息 默认8字节)
子主题
class pointer
指向 类.class 的地址。 记录这个对象属于哪个class。(属于对象头信息 默认4字节)
instance data
记录成员变量的地址。如果有一个int类型成员变量,占4字节
padding
对齐8字节。64位系统,整个类的所占字节数需要被8字节整除
结构图
JOL工具
子主题
子主题
控制线程同步
synchronized + wait + notify
ReentrantLock 可重入锁
CountDownLatch
CyclicBarrier
实例代码
ReadWriteLock
Semaphore 信号量
Exchanger
实例代码
LockSupport
实例代码
同步容器
容器总图
总图
ConcurrentHashMap
HashTable 各种同步锁。 基本废弃了
HashMap 完全没有锁。但是数据结构实现上优化了。
Collections.synchronizedHashMap 给HashMap套synchroized锁。和HashTable本质区别不大
ConcurrentHashMap: 用CAS实现。轻量级。
ConcurrentSkipListMap 跳表结构带排序的容器
CopyOnWriteArrayList,CopyOnWriteArraySet 写时复制
Queue
BlockingQueue 阻塞队列
ArrayBlockingQueue,LinkedBlockingQueue 标准的阻塞队列
DelayQueue 按照任务delay值排序的队列
SynchronousQueue 线程信息交互队列
TransferQueue 也用于线程之间传递数据
ConcurrentLinkedQueue 非阻塞 线程安全队列
线程池
基础接口
Executor 接口
ExecutorService 接口
Future 接口
ThreadPoolExecutor
corePoolSize: 核心线程数。
maximumPoolSize: 最大线程数。 核心线程+工作线程总共的个数
keepAliveTime:生存时间。空闲时间达到后,工作线程会销毁。核心线程不销毁
TimeUnit: 时间单位。
BlockingQueue:阻塞队列,存放任务task
ThreadFactory:用于创建一个线程。newThread()
RejectedExecutionHandler: 拒绝策略。任务队列达到后,而且执行任务的最大线程数达到后,再往线程池添加任务,就需要拒绝。
CompletableFuture 类
控制多个异步线程,同时执行,用allOf 和 join阻塞,让多个线程同步结束。并且可以得到返回值
Excutors 工具类
newSingleThreadExecutor 只有一个线程的线程池
newCachedThreadPool 0个核心线程数的线程池
newFixedThreadPool 固定个核心线程数的线程池
newScheduledThreadPool 时间调度任务,每隔多久执行一次任务
ForkJoinPool
Excutors.newWorkStealingPool
子主题
扩展知识
JMH 基准测试工具。
Distruptor 框架入门,单机内存队列
0 条评论
下一页