07 2021 档案
摘要:1.如何优化一个询价应用的核心代码呢? ThreadPoolExecutor+Future的方案, 用3个线程异步执行,通过3次调用future的get方法后去查价结果,然后价格保存在数据库中 // 创建线程池 ExecutorService executor = Executors.newFixe
阅读全文
摘要:1.抓子线程的信息, 子线程的断点打的时候,可以选择 小红点,右键,选择Thread 2.查看当前的栈信息 3.去掉无用import ctrl + alt + o
阅读全文
摘要:1.异步编程 串行操作并行化,涉及到异步化 异步化,是并行方案得以实施的接触,利用多线程优化性能这个核心方案来实施的基础。 jdk1.8提供了CompletableFuture支持异步编程 2.CompletableFuture 核心优势 烧水泡茶,3个任务 任务1,洗水壶,烧开水 任务2,洗茶壶,
阅读全文
摘要:1.如何使用线程池 ThreadPoolExecutor是否提供了获取任务执行结果的功能呢 2.如何获取任务执行结果 3个sumit方法+1个futureTask工具类 Future<?> submit(Runnable task); <T> Future<T> submit(Callable<T>
阅读全文
摘要:1.创建线程 创建对象,仅仅在jvm堆里分配一块内存 创建线程,调用操作系统内核api,操作系统为线程分配一系列资源,线程是重量级对象,应该避免频繁创建和销毁 2.线程池 线程池和一版池化资源不同,一般池化资源是acquire申请资源,release释放资源 java提供的线程池里没有申请线程和释放
阅读全文
摘要:1.原子类 可见性问题,可以通过volatile解决 原子性问题,可以采用互斥锁方案 2.无锁方案 public class Test { AtomicLong count = new AtomicLong(0); void add10K() { int idx = 0; while(idx++ <
阅读全文
摘要:1.并发容器 容器4大类List,Map,Set,Queue 但不是所有的容器都是线程安全的 2.非线程安全的容器如何变为线程安全的容器 把非线程安全的容器封装在对象内部,控制好访问路径就可以了 3.ArrayList 变为线程安全的的列表 SafeArrayList SafeArrayList<T
阅读全文
摘要:1.校对逻辑 2.单线程里循环查询订单,派送单,执行对账 while(存在未对账订单){ // 查询未对账订单 pos = getPOrders(); // 查询派送单 dos = getDOrders(); // 执行对账操作 diff = check(pos, dos); // 差异写入差异库
阅读全文
摘要:1.StampedLock 读多写少的场景,StampedLock性能比读写锁更好 2.StampedLock 支持的三种锁模式 读写锁,2种模式,读锁,写锁 stampedLock是3种模式,写锁,悲观锁,乐观锁 写锁,悲观锁的语意和ReadWriteLock的写锁,读锁,语意类似,允许多个线程同
阅读全文
摘要:1.其他工具类 用途:分场景优化性能,提升易用性 2.并发场景,读多写少 使用缓存,缓存元数据,缓存基础数据 缓存的数据一定是读多写少 3.读写锁ReadWriteLock 非常容易使用,性能很好 1.允许多个线程同时读共享变量 2.只允许一个线程写共享变量 3.如果一个写线程正在执行写操作,此时禁
阅读全文
摘要:1.Semaphore 信号量,类比红绿灯 编程中,线程能不能执行,看信号量是否允许 2.信号量模型 计数器+等待队列+三个方法 计数器和等待队列对外是透明的,只能通过提供的三个方法(init,down,up)来访问它们 init()设置计数器的初始值 down()计数器值减1,计数器当前值小于0,
阅读全文
摘要:Dubbo用管程实现异步转同步 Lock可以响应中断,支持超时,以及非阻塞获取锁 Condition实现了管程里面的条件变量 synchronized里的条件变量只有1个,而Lock和Condition的组合可以有多个条件变量 1.利用两个条件变量实现阻塞队列 阻塞队列,2个条件变量,1个是队列不空
阅读全文
摘要:1.并发领域核心问题互斥 同一时刻只能一个线程访问共享资源。 Lock解决互斥问题 2.并发领取核心问题同步 线程之间如何通信,协作 Condition解决同步问题 3.为什么要重复造轮子 synchronized已经实现管程,为什么要再实现一遍管程 synchronized性能不好 synchro
阅读全文
摘要:面向对象思想写并发程序 1. 封装共享变量 面向对象封装, 属性和实现细节封装在对象内部,外部通过公共方法简介访问内部属性 将共享变量作为对象属性封装在内部,对外公共方法制定并发访问策略 以计数器为例,共享变量value,将公共方法get和addOne声明为同步方法,这样就对共享变量的操作就变成了线
阅读全文
摘要:1.局部变量的线程安全问题 局部变量不是共享变量 2.方法是如何被执行的 cpu找到方法的地址,跳到地址执行代码。 cpu从cpu的堆栈寄存器找到方法的参数和返回地址。方法栈 3.局部变量存哪里 方法内的局部变量存哪里 局部变量和方法同生同死。 方法调用栈的栈帧就是和方法同生同死 所以局部变量放到方
阅读全文