java并发是什么?

内容摘要
并发是什么?并发:是指在某个时间段内,多任务交替的执行任务。当有多个线程在操作时,把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行。 在一个时间段的线程代码
文章正文

并发是什么?

并发:是指在某个时间段内,多任务交替的执行任务。当有多个线程在操作时,把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行。 在一个时间段的线程代码运行时,其它线程处于挂起状。

在并发环境下,程序的封闭性被打破,出现以下特点:

● 并发程序之间有相互制约的关系。直接制约体现为一个程序需要另一个程序的计算结果;间接体现为多个程序竞争共享资源,如处理器、缓冲区等。

● 并发程序的执行过程是断断续续的。程序需要记忆现场指令及执行点。

● 当并发数设置合理并且CPU拥有足够的处理能力时,并发会提高程序的运行效率。

在并发环境中,当一个对象可以被多个线程访问到时,会造成该对象可以被任何访问到的线程进行修改,从而出现数据不一致的情况。所以提出线程安全的概念。

并发和并行

是十分容易混淆的概念。并发指的是多个任务交替进行,而并行则是指真正意义上的“同时进行”。实际上,如果系统内只有一个CPU,使用多线程时,在真实系统环境下不能并行,只能通过切换时间片的方式交替进行,从而并发执行任务。真正的并行只能出现在拥有多个CPU的系统中。

【推荐学习:Java视频教程】

为什么要用到并发?

并发编程在一定程度上离不开多核CPU的发展。随着单核CPU的研发已经不能遵循“摩尔定律”(摩尔定律是硬件发展的观测定律,另外还有基于“摩尔定律”的“反摩尔定律”,不过“反摩尔定律”是软件领域的定律,有兴趣的可以自行了解),硬件工程师们为了进一步提升计算速度,而不是再追求单独的计算单元,而是将多个计算单元整合到了一起,也就是形成了多核CPU。短短十几年的时间,家用型CPU,比如Intel i7就可以达到4核心甚至8核心。而专业服务器则通常可以达到几个独立的CPU,每一个CPU甚至拥有多达8个以上的内核。

因此,“摩尔定律”似乎在CPU核心扩展上继续得到体验。而在多核的CPU的背景下,催生了并发编程的趋势,通并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升。

在特殊的业务场景下先天的就适合于并发编程。比如在图像处理领域,一张1024X768像素的图片,包含达到78万6千多个像素。即时将所有的像素遍历一边都需要很长的时间,面对如此复杂的计算量就需要充分利用多核的计算的能力。

另外在开发购物平台时,为了提升响应速度,需要拆分,减库存,生成订单等等这些操作,就可以进行拆分利用多线程的技术完成。面对复杂业务模型,并行程序会比串行程序更适应业务需求,而并发编程吻合更能这种业务拆分正是因为这些优点,使得多线程技术能够得到重视,也是一名CS学习者应该掌握的:

● 充分利用多核CPU的计算能力;

● 方便进行业务拆分,提升应用性能

并发编程有哪些缺点?

1、频繁的上下文切换

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

每次切换时,需要把当前的状态保存起来,以便能够进行恢复先前状态,而这个切换行为非常损耗性能,过于频繁切换反而无法发挥出多线程编程的优势。通常减少上下文切换可以采用无锁并发编程、 CAS算法、使用最少的线程和使用协程。

无锁并发编程:可以参照的ConcurrentHashMap锁分段的思想,不同的线程处理不同段的数据,这样在多线程竞争的条件下,可以减少上下文切换的时间。

CAS算法,利用原子下使用CAS算法来更新数据,使用了乐观锁,可以有效的减少一部分不必要的锁竞争带来的上下文切换

使用最少线程:避免创建不需要的线程,比如任务很少,但是创建了很多的线程,这样会造成大量的线程都处于等待状态

协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换

由于上下文切换是个相对比较耗时的操作,所以在 “Java的并发编程的艺术” 一书中有过一个实验,并发累加未必会比串行累加速度快。

2、线程的安全性问题

多线程编程中最难以把握的就是临界区线程安全问题,稍微不注意就会出现死锁的情况,一旦产生死锁就会造成系统功能不可用。

代码注释
[!--zhushi--]

作者:喵哥笔记

IDC笔记

学的不仅是技术,更是梦想!