Java并发编程的艺术 -- Java并发编程的挑战(第一章)

简介: Java并发编程的挑战(第一章)
本文参考于《Java并发编程的艺术》

1、 总述

并发编程的目的为了让程序运行得更快,但是,并不是启动更多的线程就能让程序最大限度地并发执行。在进行并发编程时,如果希望通过多线程执行任务让程序运行得更快,会面临非常多的挑战,比如上下文切换的问题死锁的问题,以及受限于硬件和软件的资源限制问题

2、线程上下文切换

2.1、切换过程

CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换

2.2、 线程上下文切换的缺点

上下文切换会消耗大量时间,从而影响多线程的执行速度。

2.3、多线程一定快吗?

不一定。

原因因为线程有创建和上下文切换的开销

2.4、如何减少上下文切换?

  1. 无锁并发编程:多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,如将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据。
  2. CAS算法:Java的Atomic包使用CAS算法来更新数据而不需要加锁
  3. 使用最少线程避免创建不需要的线程,比如任务很少,但是创建了很多线程来处理,这样会造成大量线程都处于等待状态。
  4. 使用协程在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换协程不是进程也不是线程,而是一种特殊的函数,这个函数可以在某个地方挂起,也可以从挂起处继续执行。一个线程的多个协程是串行执行的,当一个协程执行时,其他协程必须挂起。使用协程不再需要陷入系统的内核态执行效率非常高没有线程切换的开销更不需要多线程的锁机制

3、死锁

3.1、 什么是死锁?

线程死锁描述的是这样一种情况多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被 无限期地阻塞,因此程序不可能正常终止。

3.2、 产生死锁的条件

1. 互斥条件:该资源任意一个时刻 只由一个线程占用
2. 请求与保持条件:一个进程因请求资源而 阻塞时对已获得的资源保持不放
3. 不剥夺条件: 线程已获得的资源在未使用完之前不能被其他线程强行剥夺,只有自己使用完毕后才释放资源。
4. 循环等待条件:若干线程之间形成一种 头尾相接的循环等待资源关系

3.3、 如何预防死锁?

1. 破坏请求与保持条件一次性申请所有的资源
2. 破坏不剥夺条件 :占用部分资源的线程进一步申请其他资源时, 如果申请不到,可以主动释放它占有的资源
3. 破坏循环等待条件 :靠按序申请资源来预防。 按某一顺序申请资源,释放资源则反序释放。破坏循环等待条件。

3.4、 如何避免死锁?

避免死锁就是在资源分配时,借助于 算法(比如银行家算法)对资源分配进行计算评估,使其进入安全状态。

4、资源限制问题

4.1、什么是资源限制?

资源限制是指在进行并发编程时, 程序的执行速度受限于计算机硬件资源或软件资源

4.2、资源限制引发的问题

将代码执行速度加快的原则将代码中串行执行的部分变成并发执行,但是如果将某段串行的代码并发执行,因为受限于资源,仍然在串行执行,这时候程序不仅不会加快执行,反而会更慢因为增加了上下文切换和资源调度的时间

4.3、如何解决资源限制的问题?

  1. 对于硬件资源限制,可以考虑使用集群并行执行程序。既然单机的资源有限制,那么就让程序在多机上运行。
  2. 对于软件资源限制,可以考虑使用资源池将资源复用

4.4、在资源限制情况下怎样进行并发编程?

根据不同的资源限制调整程序的并发度,比如下载文件程序依赖于两个资源——带宽和硬盘读写速度。
相关文章
|
19小时前
|
Java 调度
Java并发编程:深入理解线程池
【5月更文挑战第11天】本文将深入探讨Java中的线程池,包括其基本概念、工作原理以及如何使用。我们将通过实例来解释线程池的优点,如提高性能和资源利用率,以及如何避免常见的并发问题。我们还将讨论Java中线程池的实现,包括Executor框架和ThreadPoolExecutor类,并展示如何创建和管理线程池。最后,我们将讨论线程池的一些高级特性,如任务调度、线程优先级和异常处理。
|
1天前
|
缓存 Java 数据库
Java并发编程学习11-任务执行演示
【5月更文挑战第4天】本篇将结合任务执行和 Executor 框架的基础知识,演示一些不同版本的任务执行Demo,并且每个版本都实现了不同程度的并发性。
20 4
Java并发编程学习11-任务执行演示
|
2天前
|
存储 安全 Java
12条通用编程原则✨全面提升Java编码规范性、可读性及性能表现
12条通用编程原则✨全面提升Java编码规范性、可读性及性能表现
|
2天前
|
缓存 Java 程序员
关于创建、销毁对象⭐Java程序员需要掌握的8个编程好习惯
关于创建、销毁对象⭐Java程序员需要掌握的8个编程好习惯
关于创建、销毁对象⭐Java程序员需要掌握的8个编程好习惯
|
2天前
|
缓存 Java 数据库
Java并发编程中的锁优化策略
【5月更文挑战第9天】 在高负载的多线程应用中,Java并发编程的高效性至关重要。本文将探讨几种常见的锁优化技术,旨在提高Java应用程序在并发环境下的性能。我们将从基本的synchronized关键字开始,逐步深入到更高效的Lock接口实现,以及Java 6引入的java.util.concurrent包中的高级工具类。文中还会介绍读写锁(ReadWriteLock)的概念和实现原理,并通过对比分析各自的优势和适用场景,为开发者提供实用的锁优化策略。
3 0
|
2天前
|
算法 安全 Java
深入探索Java中的并发编程:CAS机制的原理与应用
总之,CAS机制是一种用于并发编程的原子操作,它通过比较内存中的值和预期值来实现多线程下的数据同步和互斥,从而提供了高效的并发控制。它在Java中被广泛应用于实现线程安全的数据结构和算法。
17 0
|
17天前
|
Java API 调度
[AIGC] 深入理解Java并发编程:从入门到进阶
[AIGC] 深入理解Java并发编程:从入门到进阶
|
4月前
|
Oracle Java 关系型数据库
Java 编程指南:入门,语法与学习方法
Java 是一种流行的编程语言,诞生于 1995 年。由 Oracle 公司拥有,运行在超过 30 亿台设备上。Java 可以用于: 移动应用程序(尤其是 Android 应用) 桌面应用程序 网络应用程序 网络服务器和应用程序服务器 游戏 数据库连接 等等!
38 1
|
9月前
|
存储 算法 Java
吐血整理Java编程基础入门技术教程,免费送
吐血整理Java编程基础入门技术教程,免费送
34 0
|
开发框架 Java C语言
Java学习路线-1:编程入门
Java学习路线-1:编程入门
71 0