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、在资源限制情况下怎样进行并发编程?

根据不同的资源限制调整程序的并发度,比如下载文件程序依赖于两个资源——带宽和硬盘读写速度。
相关文章
|
2天前
|
设计模式 安全 Java
Java编程中的单例模式:理解与实践
【10月更文挑战第31天】在Java的世界里,单例模式是一种优雅的解决方案,它确保一个类只有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的实现方式、使用场景及其优缺点,同时提供代码示例以加深理解。无论你是Java新手还是有经验的开发者,掌握单例模式都将是你技能库中的宝贵财富。
|
2天前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####
|
3天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
19 4
|
4天前
|
消息中间件 供应链 Java
掌握Java多线程编程的艺术
【10月更文挑战第29天】 在当今软件开发领域,多线程编程已成为提升应用性能和响应速度的关键手段之一。本文旨在深入探讨Java多线程编程的核心技术、常见问题以及最佳实践,通过实际案例分析,帮助读者理解并掌握如何在Java应用中高效地使用多线程。不同于常规的技术总结,本文将结合作者多年的实践经验,以故事化的方式讲述多线程编程的魅力与挑战,旨在为读者提供一种全新的学习视角。
24 3
|
2天前
|
设计模式 安全 Java
Java编程中的单例模式深入解析
【10月更文挑战第31天】在编程世界中,设计模式就像是建筑中的蓝图,它们定义了解决常见问题的最佳实践。本文将通过浅显易懂的语言带你深入了解Java中广泛应用的单例模式,并展示如何实现它。
|
3天前
|
存储 缓存 安全
Java内存模型(JMM):深入理解并发编程的基石####
【10月更文挑战第29天】 本文作为一篇技术性文章,旨在深入探讨Java内存模型(JMM)的核心概念、工作原理及其在并发编程中的应用。我们将从JMM的基本定义出发,逐步剖析其如何通过happens-before原则、volatile关键字、synchronized关键字等机制,解决多线程环境下的数据可见性、原子性和有序性问题。不同于常规摘要的简述方式,本摘要将直接概述文章的核心内容,为读者提供一个清晰的学习路径。 ####
16 2
|
5天前
|
安全 Java 调度
Java中的多线程编程入门
【10月更文挑战第29天】在Java的世界中,多线程就像是一场精心编排的交响乐。每个线程都是乐团中的一个乐手,他们各自演奏着自己的部分,却又和谐地共同完成整场演出。本文将带你走进Java多线程的世界,让你从零基础到能够编写基本的多线程程序。
17 1
|
11天前
|
Java 数据处理 开发者
Java多线程编程的艺术:从入门到精通####
【10月更文挑战第21天】 本文将深入探讨Java多线程编程的核心概念,通过生动实例和实用技巧,引导读者从基础认知迈向高效并发编程的殿堂。我们将一起揭开线程管理的神秘面纱,掌握同步机制的精髓,并学习如何在实际项目中灵活运用这些知识,以提升应用性能与响应速度。 ####
36 3
|
12天前
|
Java
Java中的多线程编程:从入门到精通
本文将带你深入了解Java中的多线程编程。我们将从基础概念开始,逐步深入探讨线程的创建、启动、同步和通信等关键知识点。通过阅读本文,你将能够掌握Java多线程编程的基本技能,为进一步学习和应用打下坚实的基础。
|
3月前
|
算法 Java 开发者
Java 编程入门:从零到一的旅程
本文将带领读者开启Java编程之旅,从最基础的语法入手,逐步深入到面向对象的核心概念。通过实例代码演示,我们将一起探索如何定义类和对象、实现继承与多态,并解决常见的编程挑战。无论你是编程新手还是希望巩固基础的开发者,这篇文章都将为你提供有价值的指导和灵感。