并发编程
e1122334455
这个作者很懒,什么都没留下…
展开
-
《Java并发编程实战》41到45讲学习总结
第41讲心得 该讲介绍了高性能数据库连接池HiKariCP。 数据库连接池和线程池一样,都属于池化资源,作用都是避免重量级资源的频繁创建和销毁,对于数据库连接池来说,也就是避免数据库连接频繁创建和销毁。 执行数据库操作基本上是一系列规范化的步骤:通过数据源获取一个数据库连接;创建 Statement;执行 SQL;通过 ResultSet 获取 SQL 执行结果;释放 ResultSet;释放 Statement;释放数据库连接。 //数据库连接池配置 HikariConfig config =原创 2020-08-29 20:48:37 · 171 阅读 · 0 评论 -
《Java并发编程实战》36到40讲学习总结
第36讲心得 该讲介绍了Guarded Suspension模式。 一个对象 GuardedObject,内部有一个成员变量——受保护的对象,以及两个成员方法——get(Predicate<T> p)和onChanged(T obj)方法。其中get() 方法用来实现等待,参数 p 就是用来描述这个前提条件的;onChanged() 方法可以 fire 一个事件,而这个事件往往能改变前提条件 p 的计算结果。 class GuardedObject<T>{ //受保护的原创 2020-08-22 19:59:34 · 126 阅读 · 0 评论 -
《Java并发编程实战》31到35讲学习总结
第31讲心得 该讲介绍了Fork/Join。 Fork 对应的是分治任务模型里的任务分解,Join 对应的是结果合并。Fork/Join 计算框架主要包含两部分,一部分是分治任务的线程池 ForkJoinPool,另一部分是分治任务 ForkJoinTask。。 ForkJoinTask 是一个抽象类,它的方法有很多,最核心的是 fork() 方法和 join() 方法,其中 fork() 方法会异步地执行一个子任务,而 join() 方法则会阻塞当前线程来等待子任务的执行结果。ForkJoinTas原创 2020-08-15 10:29:19 · 121 阅读 · 0 评论 -
《Java并发编程实战》26到30讲学习总结
第26讲心得 该讲介绍了Fork/Join。 Fork 对应的是分治任务模型里的任务分解,Join 对应的是结果合并。Fork/Join 计算框架主要包含两部分,一部分是分治任务的线程池 ForkJoinPool,另一部分是分治任务 ForkJoinTask。。 ForkJoinTask 是一个抽象类,它的方法有很多,最核心的是 fork() 方法和 join() 方法,其中 fork() 方法会异步地执行一个子任务,而 join() 方法则会阻塞当前线程来等待子任务的执行结果。ForkJoinTas原创 2020-08-08 13:18:45 · 136 阅读 · 0 评论 -
《Java并发编程实战》21到25讲学习总结
第21讲心得 该讲介绍了原子类。 Java SDK 并发包将无锁方案封装提炼之后,实现了一系列的原子类。其实原子类性能高的秘密很简单,硬件支持而已。CPU 为了解决并发问题,提供了 CAS 指令(CAS,全称是 Compare And Swap,即“比较并交换”)。CAS 指令包含 3 个参数:共享变量的内存地址 A、用于比较的值 B 和共享变量的新值 C;并且只有当内存中地址 A 处的值等于 B 时,才能将内存中地址 A 处的值更新为新值 C。作为一条 CPU 指令,CAS 指令本身是能够保证原子性的原创 2020-08-01 08:15:39 · 131 阅读 · 0 评论 -
《Java并发编程实战》16到20讲学习总结
第16讲心得 该讲介绍了局部变量为什么是安全的。 每个方法在调用栈中都有自己独立的空间,称为栈帧。每个栈帧中都有方法需要的参数和返回地址。调用方法时会创建新的栈帧并压入调用栈;方法返回时对应的栈帧就被自动弹出。也就是说,栈帧是和方法同生共死的。 局部变量的作用域是方法内部,也就是说局部变量也是和方法同生共死的。事实上,局部变量也放入了栈帧中。 两个线程可以用不同的参数调用同一个方法,那么线程和调用栈是什么关系呢?每个线程都有自己的调用栈,局部变量保存在各自的调用栈中。由于局部变量不会共享,所以没有并原创 2020-07-26 19:17:38 · 106 阅读 · 0 评论 -
《Java并发编程实战》11到15讲学习总结
第11讲心得 该讲介绍了局部变量为什么是安全的。 每个方法在调用栈中都有自己独立的空间,称为栈帧。每个栈帧中都有方法需要的参数和返回地址。调用方法时会创建新的栈帧并压入调用栈;方法返回时对应的栈帧就被自动弹出。也就是说,栈帧是和方法同生共死的。 局部变量的作用域是方法内部,也就是说局部变量也是和方法同生共死的。事实上,局部变量也放入了栈帧中。 两个线程可以用不同的参数调用同一个方法,那么线程和调用栈是什么关系呢?每个线程都有自己的调用栈,局部变量保存在各自的调用栈中。由于局部变量不会共享,所以没有并原创 2020-07-19 09:28:26 · 124 阅读 · 0 评论 -
《Java并发编程实战》6到10讲学习总结
第6讲心得 本讲介绍了等待-通知机制:当线程需要的条件不满足时,可以将线程阻塞,当满足条件时再进行通知,从而避免了轮询操作对CPU的消耗。 Java 语言内置的 synchronized 配合 wait()、notify()、notifyAll() 这三个方法可以快速实现等待-通知机制。 当一个线程进入临界区后,由于某些条件不满足,需要进入等待状态,Java 对象的 wait() 方法就能够满足这种需求。 当条件满足时调用 Java 对象的 notify()方法会通知等待队列中的线程,告诉它条件曾经原创 2020-07-11 15:34:52 · 180 阅读 · 0 评论 -
《Java并发编程实战》1到5讲学习总结
第1讲心得 第1讲介绍了产生并发编程Bug的原因:缓存导致的可见性问题、线程切换带来的原子性、编译优化带来的有序性问题。 为了均衡CPU和内存的速度差异,CPU引入了缓存的概念。在多核时代,每个CPU都有自己的缓存,多个线程操纵的CPU缓存是不同的,因此一个线程对共享变量的修改对另一个线程可能不是立即可见的。 通过让每个进程每次只执行一个时间片的时间操作系统做到了分时复用。进程间做任务切换需要切换内存映射地址,而线程间切换避免了切换内存映射地址的开销,因此现代操作系统都在线程间进行任务调度。原创 2020-07-04 14:47:24 · 311 阅读 · 0 评论