随笔分类 -  java并发

java并发
摘要:异步转同步有什么意义,直接使用同步方法不好吗? 一直有这个疑问,使用异步转同步就高端,直接使用同步方法一个一个直接就low,一直不理解,难道不是炫技的同时增加代码复杂度吗 后来gpt4给了我答案 使用 CompletableFuture.supplyAsync 提交异步任务然后通过 Completa 阅读全文
posted @ 2024-01-31 15:18 SpecialSpeculator 阅读(33) 评论(0) 推荐(0) 编辑
摘要:1.多个任务同时异步处理 // 设计线程池最大5个并发,其他进来排队 private ExecutorService executorPool = ThreadUtils.newDaemonFixedThreadPool(5,"APP-SCAN-THREAD"); private void comm 阅读全文
posted @ 2023-09-21 15:31 SpecialSpeculator 阅读(39) 评论(0) 推荐(0) 编辑
摘要:1.如何优化一个询价应用的核心代码呢? ThreadPoolExecutor+Future的方案, 用3个线程异步执行,通过3次调用future的get方法后去查价结果,然后价格保存在数据库中 // 创建线程池 ExecutorService executor = Executors.newFixe 阅读全文
posted @ 2021-07-14 14:38 SpecialSpeculator 阅读(126) 评论(0) 推荐(0) 编辑
摘要:1.异步编程 串行操作并行化,涉及到异步化 异步化,是并行方案得以实施的接触,利用多线程优化性能这个核心方案来实施的基础。 jdk1.8提供了CompletableFuture支持异步编程 2.CompletableFuture 核心优势 烧水泡茶,3个任务 任务1,洗水壶,烧开水 任务2,洗茶壶, 阅读全文
posted @ 2021-07-08 17:30 SpecialSpeculator 阅读(172) 评论(0) 推荐(0) 编辑
摘要:1.如何使用线程池 ThreadPoolExecutor是否提供了获取任务执行结果的功能呢 2.如何获取任务执行结果 3个sumit方法+1个futureTask工具类 Future<?> submit(Runnable task); <T> Future<T> submit(Callable<T> 阅读全文
posted @ 2021-07-08 17:02 SpecialSpeculator 阅读(62) 评论(0) 推荐(0) 编辑
摘要:1.创建线程 创建对象,仅仅在jvm堆里分配一块内存 创建线程,调用操作系统内核api,操作系统为线程分配一系列资源,线程是重量级对象,应该避免频繁创建和销毁 2.线程池 线程池和一版池化资源不同,一般池化资源是acquire申请资源,release释放资源 java提供的线程池里没有申请线程和释放 阅读全文
posted @ 2021-07-07 16:29 SpecialSpeculator 阅读(65) 评论(0) 推荐(0) 编辑
摘要:1.原子类 可见性问题,可以通过volatile解决 原子性问题,可以采用互斥锁方案 2.无锁方案 public class Test { AtomicLong count = new AtomicLong(0); void add10K() { int idx = 0; while(idx++ < 阅读全文
posted @ 2021-07-07 15:24 SpecialSpeculator 阅读(40) 评论(0) 推荐(0) 编辑
摘要:1.并发容器 容器4大类List,Map,Set,Queue 但不是所有的容器都是线程安全的 2.非线程安全的容器如何变为线程安全的容器 把非线程安全的容器封装在对象内部,控制好访问路径就可以了 3.ArrayList 变为线程安全的的列表 SafeArrayList SafeArrayList<T 阅读全文
posted @ 2021-07-06 17:53 SpecialSpeculator 阅读(41) 评论(0) 推荐(0) 编辑
摘要:1.校对逻辑 2.单线程里循环查询订单,派送单,执行对账 while(存在未对账订单){ // 查询未对账订单 pos = getPOrders(); // 查询派送单 dos = getDOrders(); // 执行对账操作 diff = check(pos, dos); // 差异写入差异库 阅读全文
posted @ 2021-07-06 17:08 SpecialSpeculator 阅读(37) 评论(0) 推荐(0) 编辑
摘要:1.StampedLock 读多写少的场景,StampedLock性能比读写锁更好 2.StampedLock 支持的三种锁模式 读写锁,2种模式,读锁,写锁 stampedLock是3种模式,写锁,悲观锁,乐观锁 写锁,悲观锁的语意和ReadWriteLock的写锁,读锁,语意类似,允许多个线程同 阅读全文
posted @ 2021-07-06 16:18 SpecialSpeculator 阅读(64) 评论(0) 推荐(0) 编辑
摘要:1.其他工具类 用途:分场景优化性能,提升易用性 2.并发场景,读多写少 使用缓存,缓存元数据,缓存基础数据 缓存的数据一定是读多写少 3.读写锁ReadWriteLock 非常容易使用,性能很好 1.允许多个线程同时读共享变量 2.只允许一个线程写共享变量 3.如果一个写线程正在执行写操作,此时禁 阅读全文
posted @ 2021-07-06 14:37 SpecialSpeculator 阅读(47) 评论(0) 推荐(0) 编辑
摘要:1.Semaphore 信号量,类比红绿灯 编程中,线程能不能执行,看信号量是否允许 2.信号量模型 计数器+等待队列+三个方法 计数器和等待队列对外是透明的,只能通过提供的三个方法(init,down,up)来访问它们 init()设置计数器的初始值 down()计数器值减1,计数器当前值小于0, 阅读全文
posted @ 2021-07-06 14:03 SpecialSpeculator 阅读(82) 评论(0) 推荐(0) 编辑
摘要:1.并发领域核心问题互斥 同一时刻只能一个线程访问共享资源。 Lock解决互斥问题 2.并发领取核心问题同步 线程之间如何通信,协作 Condition解决同步问题 3.为什么要重复造轮子 synchronized已经实现管程,为什么要再实现一遍管程 synchronized性能不好 synchro 阅读全文
posted @ 2021-07-01 16:16 SpecialSpeculator 阅读(51) 评论(0) 推荐(0) 编辑
摘要:面向对象思想写并发程序 1. 封装共享变量 面向对象封装, 属性和实现细节封装在对象内部,外部通过公共方法简介访问内部属性 将共享变量作为对象属性封装在内部,对外公共方法制定并发访问策略 以计数器为例,共享变量value,将公共方法get和addOne声明为同步方法,这样就对共享变量的操作就变成了线 阅读全文
posted @ 2021-07-01 15:15 SpecialSpeculator 阅读(36) 评论(0) 推荐(0) 编辑
摘要:1.局部变量的线程安全问题 局部变量不是共享变量 2.方法是如何被执行的 cpu找到方法的地址,跳到地址执行代码。 cpu从cpu的堆栈寄存器找到方法的参数和返回地址。方法栈 3.局部变量存哪里 方法内的局部变量存哪里 局部变量和方法同生同死。 方法调用栈的栈帧就是和方法同生同死 所以局部变量放到方 阅读全文
posted @ 2021-07-01 15:00 SpecialSpeculator 阅读(80) 评论(0) 推荐(0) 编辑
摘要:1.java的线程与操作系统线程一一对应 2.通用线程生命周期 初试状态,可运行状态,运行状态,休眠状态,终止状态 初试状态,线程已经被创建,还不允许被cpu执行,编程语言特有的,而操作系统还没有被创建 可运行状态,线程可以被cpu执行,这种状态下,真正操作系统的线程已经被成功创建了,可以分配cpu 阅读全文
posted @ 2021-06-30 17:40 SpecialSpeculator 阅读(44) 评论(0) 推荐(0) 编辑
摘要:1.管程 管程就是解决并发问题的万能钥匙 管理共享变量以及对共享变量的操作过程,让他们支持并发 2.MESA模型 互斥:统一个时刻只允许一个线程访问共享资源 同步:线程之间如何通信,协作 解决互斥问题:将共享变量及对共享变量的操作统一封装起来。 将线程不安全的队列封装起来,对外提供线程安全的操作方法 阅读全文
posted @ 2021-06-30 17:11 SpecialSpeculator 阅读(26) 评论(0) 推荐(0) 编辑
摘要:1.安全性问题 线程安全:本质上就是正确性。 避免原子性问题,可见性问题,有序性问题,就是线程安全的程序 什么情况需要考虑安全性问题? 存在共享数据并且该数据会发生变化。多线程同时读写同一数据。 如果不共享数据,状态就不会发生变化 ThreadLocal,TLS ,不变模式 2.活跃性问题 某个操作 阅读全文
posted @ 2021-06-30 17:00 SpecialSpeculator 阅读(88) 评论(0) 推荐(0) 编辑
摘要:1.循环等待 转出账本和转入账本不满足时,用死循环的方式循环等待 // 一次性申请转出账户和转入账户,直到成功 while(!actr.apply(this, target)) ; 耗时非常短,并发冲突量不大时,还可以,耗时长的话,太耗cpu了 2.最优解决方案 线程要求的条件(转出账本和转入账本同 阅读全文
posted @ 2021-06-30 16:41 SpecialSpeculator 阅读(72) 评论(0) 推荐(0) 编辑
摘要:1.3个人互相转账 3个人互相转账,串行 2.账本 文件架上有转出账本+转入账本,同时拿走 文件架上只有转出账本,柜员就先把文件架上的转出账本拿到手里,同时等着另一个账本送回来。 文件架上一个账本都没有,等两个账本都回来。 3.明细 class Account { private int balan 阅读全文
posted @ 2021-06-30 16:21 SpecialSpeculator 阅读(36) 评论(0) 推荐(0) 编辑

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