你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

Java 随笔 并发 1-前言

2021/12/22 1:06:41

0. 感觉最近有点犯难了…

《Thinking in java 4th》第21章 并发


并发看起来充满了危险,如果你对它有些畏惧,这可能是件好事…

1. 并发的多面性

作者在“性能优化”和“设计可管理性”的角度上的讨论让人印象深刻(Atom类、显式锁…)

cpu
更好的利用多核处理器,同样也提升了单核处理器的程序性能
单核处理器上运行并发程序,会带来额外的上下文切换的代价
考虑阻塞的存在,单核处理器此时可以“腾出手来”,去做其他的事情,保证了程序一定的可响应性
并发显著提升单核处理器的程序性能的案例,即 事件驱动编程

进程不同于线程,进程各自拥有隔离的地址空间,严格来说,进程之间没有彼此通信的需要,这样可以做到互不影响(例如MQ的脚本语言Erlang)

2.改进代码设计

java的线程机制是抢占式的,这表示调度机制会周期性中断线程,将上下文切换到另一个线程,从而为每个线程都提供时间片。

协作式系统(互相让步)带来的上下文切换的开销要比抢占式系统低廉,理论上对并发的线程数量没有限制。

3. 使用Executor

执行器,客户端&任务之间的中间层对象,无需显示的管理线程的生命周期
ExecutorService 具有生命周期的Executor
shutdown()

4. Thread Pool

线程池,可维护的线程集合,省去冗余的操作、反复创建/释放线程的开销
FixThreadPool 有界的xxx
CacheThreadPool 创建与所需线程数等同的线程
SingleThreadPool 线程数量为1的xxx,提交的多个任务将排队,均使用相同的线程走完

5. 从任务中产生返回值

ExecutorService.submit(Callable) -Future
get()
isDone()

6. 编码的变体

在类构造中执行Thread.start(),将导致在类未初始化完成之前,被访问。
这也是建议使用Executor的原因

7. 术语

在Java中,Thread类本身并不执行任何操作,它只是驱动(start())所赋予它的任务(比如说Runnable、Callable),但是线程研究总是不变地使用“线程执行某项动作”这类语言。因此,你得到的印象就是“线程就是任务”,但执行的动作即“任务”,唯有讨论到驱动任务的具体机制时,才会使用"线程"这类术语。

8. 加入一个线程

对join()方法的调用可以被中断,做法是在调用线程上调用interrupt(),这也会需要声明try-catch捕获InterruptException

9. 共享受限资源

Java的递增程序自身也需要多个步骤,也就是说递增过程中可能会发生线程被挂起,即Java的递增不是原子性的