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