Java并发编程之美
Java并发编程之美阅读笔记
我这不是胖我是幸福肥
既然选择了远方,便只顾风雨兼程。
展开
-
第9章 Java并发包中ScheduledThreadPoolExecutor原理探究
9.1 介绍ThreadPoolExecutor只是Executors工具类的一部分功能。下面来介绍另外一部分功能,也就是ScheduledThreadPoolExecutor的实现,这是一个可以在指定一定延迟时间后或者定时进行任务调度执行的线程池。9.2 类图介绍Executors其实是个工具类,它提供了好多静态方法,可根据用户的选择返回不同的线程池实例。ScheduledThreadPoolExecutor继承了ThreadPoolExecutor并实现了ScheduledExecutorServ原创 2020-06-17 17:11:42 · 167 阅读 · 0 评论 -
第8章 Java并发包中线程池ThreadPoolExecutor原理探究
8.1 介绍线程池主要解决两个问题:一是当执行大量异步任务时线程池能够提供较好的性能。在不使用线程池时,每当需要执行异步任务时直接new一个线程来运行,而线程的创建和销毁是需要开销的。线程池里面的线程是可复用的,不需要每次执行异步任务时都重新创建和销毁线程。二是线程池提供了一种资源限制和管理的手段,比如可以限制线程的个数,动态新增线程等。每个ThreadPoolExecutor也保留了一些基本的统计数据,比如当前线程池完成的任务数目等。另外,线程池也提供了许多可调参数和可扩展性接口,以满足不同情原创 2020-06-16 11:12:05 · 186 阅读 · 0 评论 -
第7章 Java并发包中并发队列原理剖析
JDK中提供了一系列场景的并发安全队列。总的来说,按照实现方式的不同可分为阻塞队列和非阻塞队列,前者使用锁实现,而后者则使用CAS非阻塞算法实现。Java并发包中的并发队列:ConcurrentLinkedQueue是线程安全的无界非阻塞队列独占锁实现的有界阻塞队列LinkedBlockingQueue有界数组方式实现的阻塞队列ArrayBlockingQueuePriorityBlockingQueue是带优先级的无界阻塞队列DelayQueue并发队列是一个无界阻塞延迟队列7.1 Co原创 2020-06-01 15:28:15 · 249 阅读 · 0 评论 -
第6章 Java并发包中锁原理剖析
6.1 LockSupport工具类JDK中的rt.jar包里面的LockSupport是个工具类,它的主要作用是挂起和唤醒线程,该工具类是创建锁和其他同步类的基础。LockSupport类与每个使用它的线程都会关联一个许可证,在默认情况下调用LockSupport类的方法的线程是不持有许可证的。LockSupport是使用Unsafe类实现的。下面介绍LockSupport中的几个主要函数:/** * 如果调用park方法的线程已经拿到了与LockSupport关联的许可证,则调用LockSuppo原创 2020-05-21 17:58:17 · 146 阅读 · 0 评论 -
第5章 Java并发包中并发List源码剖析
5.1 5.2 主要方法源码解析 略5.3 总结CopyOnWriteArrayList使用写时复制的策略来保证list的一致性,而获取—修改—写入三步操作并不是原子性的,所以在增删改的过程中都使用了独占锁,来保证在某个时间只有一个线程能对list数组进行修改。另外CopyOnWriteArrayList提供了弱一致性的迭代器,从而保证在获取迭代器后,其他线程对list的修改是不可见的,迭代器遍历的数组是一个快照。...原创 2020-05-21 17:56:42 · 122 阅读 · 0 评论 -
第4章 Java并发包中原子操作类原理剖析
4.1 原子变量操作类JUC并发包中包含有AtomicInteger、AtomicLong和AtomicBoolean等原子性操作类,它们的原理类似。AtomicLong是原子性递增或者递减类,其内部使用Unsafe来实现。在没有原子类的情况下,实现计数器需要使用一定的同步措施,比如使用synchronized关键字等,但是这些都是阻塞算法,对性能有一定损耗,原子操作类都使用CAS非阻塞算法,性能更好。但是在高并发情况下AtomicLong还会存在性能问题。JDK 8提供了一个在高并发下性能更好的Lon原创 2020-05-19 15:56:16 · 177 阅读 · 0 评论 -
第3章 Java并发包中ThreadLocalRandom类原理剖析
3.1 Random类及其局限性随机数的生成需要一个默认的种子,这个种子其实是一个long类型的数字,可以在创建Random对象时通过构造函数指定,如果不指定则在默认构造函数内部生成一个默认的值。新的随机数的生成需要两个步骤:首先根据老的种子生成新的种子。然后根据新的种子来计算新的随机数。每个Random实例里面都有一个原子性的种子变量用来记录当前的种子值,当要生成新的随机数时需要根据当前种子计算新的种子并更新回原子变量。在多线程下使用单个Random实例生成随机数时,当多个线程同时计算随机数来原创 2020-05-12 17:32:30 · 357 阅读 · 0 评论 -
第2章 并发编程的其他基础知识
2.1 什么是多线程并发编程并发:是指同一个时间段内多个任务同时都在执行,并且都没有执行结束。并发任务强调在一个时间段内同时执行,而一个时间段由多个单位时间累积而成,所以说并发的多个任务在单位时间内不一定同时在执行。在单CPU的时代多个任务都是并发执行的,这是因为单个CPU同时只能执行一个任务。在单CPU时代多任务是共享一个CPU的,当一个任务占用CPU运行时,其他任务就会被挂起,当占用CPU的任务时间片用完后,会把CPU让给其他任务来使用,所以在单CPU时代多线程编程是没有太大意义的,并且线程间频繁的上原创 2020-05-09 16:15:57 · 238 阅读 · 0 评论 -
第1章 并发编程线程基础
1.1 什么是线程进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是进程的一个执行路径,一个进程中至少有一个线程,进程中的多个线程共享进程的资源。操作系统在分配资源时是把资源分配给进程的,但是CPU资源比较特殊,它是被分配到线程的,因为真正要占用CPU运行的是线程,所以也说线程是CPU分配的基本单位。在Java中,当我们启动main函数时其实就启动了一个JVM的进程,而main函数所在的线程就是这个进程中的一个线程,也称主线程。进程和线程的关系如图一个进程中有多个原创 2020-05-08 17:38:14 · 175 阅读 · 0 评论