概述
- 什么是并发,与并行的区别
- 为什么要用到并发
- 并发编程最佳实践
什么是并发,与并行的区别
在计算机程序世界中,并发指的是计算机可以执行多个任务的能力;而并行指计算机能同时处理多个任务,它们的最关键点是同时。
为什么要用到并发
多核的CPU的背景下,催生了并发编程的趋势,并发编程的形式可以将多核CPU的计算能力发挥到极致,提高程序的性能
并发编程最佳实践
先说说并发编程哪些缺点,或者说要注意些什么:
上下文切换
时间片是CPU分配给各个线程的时间,因为时间非常短,所以CPU不断通过切换线程,让我们觉得多个线程是同时执行的,时间片一般是几十毫秒。
如果多个线程在并发执行任务的时候频繁地切换上下文,将无法发挥并发编程的优势,因为上下文的切换要保存当前状态,以便能够恢复先前状态,而上线文切换又非常损耗性能。
线程安全
- 多线程编程中最难以把握的就是临界区线程安全问题,稍微不注意就会出现死锁的情况,一旦产生死锁就会造成系统功能不可用。
- 如何保证线程安全
- 如何正确理解由于JMM内存模型在原子性,有序性,可见性带来的问题
- 数据脏读
- DCL双重检车加锁
DCL双重检车加锁
DCL双重检车加锁的真正问题在于:当没有同步的情况下读取一个共享对象时,读到的可能是一个尚未创建完成的对象,可能是一个失效的值。
为什么要第二次判断呢?
原因是当多个线程都经过了第一次判空之后,如果锁内不判空,就会导致实例被重复创建
对于可变对象必须通过安全的方式来发布,这通常意味着在发布和使用该对象时都必须使用同步,我们可以使用一下的方式来安全地发布对象:
《Java并发编程实战》3.5.3,16.2.4