随笔分类 -  高并发

摘要:1. 限流器 1.1 限流器 常见限流算法: 计数器算法 计数器算法是一种简单的限流方法,通过对请求进行计数,当请求达到一定的阈值时,进行限制。这种方法适用于简单场景,但不够灵活。容易出现临界时间点限流失效问题。 滑动窗口算法 滑动窗口算法维护一个时间窗口内的请求数量,通过动态调整窗口大小,可以更灵 阅读全文
posted @ 2023-12-06 21:46 kiper 阅读(110) 评论(0) 推荐(0) 编辑
摘要:目录0. 总体1. 不可变模式1.1 定义1.2 享元模式2. 写时复制模式3. 线程本地存储模式3.1 原理3.1.1 底层实现3.1.2 设计原因3.1.3 内存泄漏原因3. 2 例子4. 保护性暂挂模式(Guarded Suspension)4.1 定义及原理4.2 异步等待消息的例子4.3 阅读全文
posted @ 2023-12-04 20:01 kiper 阅读(102) 评论(0) 推荐(0) 编辑
摘要:同步工具类存在的意义 管程或者信号量可以解决所有的并发问题,那么同步工具类存在的意义是什么呢? 两个字:方便。 针对不同的并发场景,使用对应的工具类可以快速完成业务开发。 1. 锁工具 1.1 ReadWriteLock 读锁 写锁 1.1.1 使用场景 允许多个线程同时读共享变量 只允许一个线程写 阅读全文
posted @ 2023-11-30 15:25 kiper 阅读(43) 评论(0) 推荐(0) 编辑
摘要:JUC类图 1 定义 AQS(AbstractQueuedSynchronizer)是一个用来构建锁和同步器的框架,是Java并发包中的核心基础组件。 使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如ReentrantLock,Semaphore,其他的诸如ReentrantReadWri 阅读全文
posted @ 2023-11-29 11:45 kiper 阅读(19) 评论(0) 推荐(0) 编辑
摘要:0. 用锁的最佳实践 永远只在更新对象的成员变量时加锁 永远只在访问可变的成员变量时加锁 永远不在调用其他对象的方法时加锁 1. Lock与Synchronize区别 Lock是由代码实现,核心是CAS操作;synchronize则是关键字,通过修改对象头中的锁信息,由JVM实现调用。更详细的底层原 阅读全文
posted @ 2023-11-28 17:18 kiper 阅读(15) 评论(0) 推荐(0) 编辑
摘要:1. 线程池 作用 提升资源使用率,避免无意义的线程重复创建销毁成本 提升反应速度,已提前创建线程 方便管理线程资源,如可控制并发量、批量中断等 参数 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keep 阅读全文
posted @ 2023-11-27 17:15 kiper 阅读(66) 评论(0) 推荐(0) 编辑
摘要:1.基本概念 互斥 只有一个线程能访问临界区。 临界资源 多个线程可以共享系统中的资源,但是临界资源只允许一个线程在某一时刻访问。如某些变量、硬件资源。 临界区 访问临界资源的代码即临界区。 2.信号量与管程 管程(Monitors)和信号量(Semaphores)是操作系统中用于实现并发编程的两种 阅读全文
posted @ 2023-11-25 16:36 kiper 阅读(170) 评论(0) 推荐(0) 编辑
摘要:1. 操作系统线程生命周期 操作系统线程生命状态有5种。 初始状态(New) 进程正在被创建时的状态。仅为线程对象开辟了一块堆内存,实际上线程在操作系统层面还未创建。 就绪状态 (Ready) 可运行,由于其他进程处于运行状态而暂时停止运行 运行状态 (Running) 该进程此时正占用CPU 阻塞 阅读全文
posted @ 2023-11-24 15:27 kiper 阅读(15) 评论(0) 推荐(0) 编辑
摘要:背景 之前某需求在触发流控时需要中断ExcutorService中的子线程,发现无论Shutdown、ShutdownNow方法都无法直接停止子线程,今天看到线程的interrupt()方法才了解如何停止。 stop() 和 interrupt() stop方法 stop() 方法会真的杀死线程,不 阅读全文
posted @ 2023-03-18 17:26 kiper 阅读(172) 评论(0) 推荐(0) 编辑
摘要:安全性 并发bug三大源头 源头 原子性问题 可见性问题 有序性问题 bug风险点 存在共享数据并且该数据会发生变化(即多个线程会同时读写同一数据) 分类 数据竞争 当多个线程同时访问同一数据,并且至少有一个线程会写这个数据。 假设 count=0,当两个线程同时执行 get() 方法时,get() 阅读全文
posted @ 2023-03-18 15:37 kiper 阅读(40) 评论(0) 推荐(0) 编辑
摘要:原子性 原子性:一个或多个操作在CPU执行的过程中不被中断的特性 原子性问题源头是线程切换,保证对共享变量的修改时互斥的,就可以保障原子性。 简易锁模型 临界区:一段需要互斥执行的代码 改进锁模型 明确锁的范围,能够锁住的资源。 简易锁模型容易出问题的地方: 1、锁住了错误的资源 2、锁的粒度太大, 阅读全文
posted @ 2023-03-13 18:17 kiper 阅读(68) 评论(0) 推荐(0) 编辑
摘要:Java内存模型 并发场景下,可见性/原子性/有序性是并发编程Bug源头,而Java内存模型解决了可见性和有序性问题。 Java内存模型定义 可见性问题原因是缓存,有序性问题原因是编译优化。为了兼顾程序性能和功能正常,按需禁用缓存以及编译优化。而按需,则是按照开发者代码完成。 Java 内存模型是个 阅读全文
posted @ 2023-03-11 16:44 kiper 阅读(81) 评论(0) 推荐(1) 编辑
摘要:目录背景核心矛盾解决思路异常根源cpu缓存导致的可见性问题线程切换带来的原子性问题编译优化带来的有序性问题 背景 核心矛盾 CPU/内存/IO设备的速度差异 解决思路 计算机体系结构——CPU 增加了缓存,以均衡与内存的速度差异 操作系统——操作系统增加了进程、线程,以分时复用 CPU,进而均衡 C 阅读全文
posted @ 2023-03-08 19:44 kiper 阅读(20) 评论(0) 推荐(1) 编辑

点击右上角即可分享
微信分享提示