并发与多线程

概述

  • 什么是并发,与并行的区别
  • 为什么要用到并发
  • 并发编程最佳实践

什么是并发,与并行的区别

在计算机程序世界中,并发指的是计算机可以执行多个任务的能力;而并行指计算机能同时处理多个任务,它们的最关键点是同时

为什么要用到并发

多核的CPU的背景下,催生了并发编程的趋势,并发编程的形式可以将多核CPU的计算能力发挥到极致,提高程序的性能

并发编程最佳实践

先说说并发编程哪些缺点,或者说要注意些什么:

上下文切换

时间片是CPU分配给各个线程的时间,因为时间非常短,所以CPU不断通过切换线程,让我们觉得多个线程是同时执行的,时间片一般是几十毫秒。

如果多个线程在并发执行任务的时候频繁地切换上下文,将无法发挥并发编程的优势,因为上下文的切换要保存当前状态,以便能够恢复先前状态,而上线文切换又非常损耗性能。

线程安全

  1. 多线程编程中最难以把握的就是临界区线程安全问题,稍微不注意就会出现死锁的情况,一旦产生死锁就会造成系统功能不可用。
  2. 如何保证线程安全
  3. 如何正确理解由于JMM内存模型在原子性,有序性,可见性带来的问题
    1. 数据脏读
    2. DCL双重检车加锁

DCL双重检车加锁

DCL双重检车加锁的真正问题在于:当没有同步的情况下读取一个共享对象时,读到的可能是一个尚未创建完成的对象,可能是一个失效的值。
为什么要第二次判断呢?
原因是当多个线程都经过了第一次判空之后,如果锁内不判空,就会导致实例被重复创建

对于可变对象必须通过安全的方式来发布,这通常意味着在发布和使用该对象时都必须使用同步,我们可以使用一下的方式来安全地发布对象:

  1. 参考链接

https://mp.weixin.qq.com/s?__biz=MzI4Njc5NjM1NQ==&mid=2247485326&idx=1&sn=62ef70c9baac6ccaec385b519cdbdb6c&chksm=ebd638a2dca1b1b4bc38d6add52c26d0c8d96021fcf0eae18a911abbb32c6b2d33b2af177d60&mpshare=1&scene=23&srcid=0509oLVaS1l1ByXNHBg7zUI1%23rd

《Java并发编程实战》3.5.3,16.2.4