Lmbench

Java并发编程的艺术[1]

冷暖自知 提交于 2020-11-02 08:19:10
昨天阅读翻译了CompletableFuture的源码,目前百度,有道,基本是翻译效果一般,Google翻译比较准确,源码有很多注释,写个小测试类将其去掉,另外获得了《Java并发编程的艺术》PDF版,因为需要测试demo,就要转word,又找了个小测试类转成word,效果不错。参考《Java并发编程的艺术》 1.上下文切换 个人理解:CPU需要暂停当前任务,执行另一个任务,另一个任务完成后再执行当前任务,我们知道 时钟中断导致cpu切换进程 原文: CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。 2.多线程一定快吗? 书中demo public class Question1 { private static final long count = 10000L; public static void main(String[] args) throws InterruptedException { concurrency(); serial(); new CompletableFuture<>(); } private static void concurrency() throws

java并发编程的艺术读书笔记(一)

故事扮演 提交于 2020-02-27 08:12:58
并发编程的目的是为了程序运行的更快。 1.上下文切换: 时间片:cpu分配给各个线程的时间。 单核处理器也支持多线程执行代码。 cpu通过时间片分配算法来循环执行任务,任务从保存到再加载的过程就是一次上下文切换。 多线程不一定快,因为线程有创建和上下文切换的开销。 使用Lmbench可以测试上下文切换的时长(什么时候需要看这个参数呢)。 使用vmstat可以测量上下文切换的次数。比如:执行vmstat 1,再看cs的值,cs表示上下文切换的次数,这个值表示每一秒钟上下文切换的次数。(什么时候需要用到这个命令呢?) 减少上下文切换的方法: 1.无锁并发编程。多线程竞争锁时,会引发上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,比如将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据。 2.CAS算法。eg:java的atomic包使用CAS算法来更新数据,而不需要加锁。 3.使用最少线程。 4.使用协程。协程:在单线程里实现多线程的调度,并在单线程里维持多个线程间的切换。 减少上下文切换实战: 通过减少线上大量WAITING的线程,来减少上下文切换的次数。 第一步:用jstack命令dump线程信息,看pid为3117的进程在做什么 sudo -u admin jstack 3117>/temp 第2步:统计所有线程分别处于什么状态 grep java

Java并发编程的艺术,解读并发编程的优缺点

南楼画角 提交于 2019-12-04 17:08:54
并发编程的优缺点 使用并发的原因 多核的CPU的背景下,催生了并发编程的趋势,通过 并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升 。 在特殊的业务场景下先天的就适合于并发编程。 比如在图像处理领域,一张1024X768像素的图片,包含达到78万6千多个像素。即时将所有的像素遍历一边都需要很长的时间, 面对如此复杂的计算量就需要充分利用多核的计算的能力。又比如当我们在网上购物时,为了提升响应速度,需要拆分,减库存, 生成订单等等这些操作,就可以进行拆分利用多线程的技术完成。 面对复杂业务模型,并行程序会比串行程序更适应业务需求,而并发编程更能吻合这种业务拆分 。 并发编程的缺点 频繁的上下文切换 时间片是CPU分配给各个线程的时间,因为时间非常短,所以CPU不断通过切换线程,让我们觉得多个线程是同时执行的,时间片一般是几十毫秒。 而每次切换时,需要保存当前的状态起来,以便能够进行恢复先前状态,而这个切换时非常损耗性能, 过于频繁反而无法发挥出多线程编程的优势。 通常减少上下文切换可以采用 无锁并发编程 , CAS算法 , 使用最少的线程 和 使用协程 。 无锁并发编程:可以参照concurrentHashMap锁分段的思想,不同的线程处理不同段的数据, 这样在多线程竞争的条件下,可以减少上下文切换的时间 CAS算法,利用Atomic下使用CAS算法来更新数据