热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

并发包前言

从今天起开启一系列并发包的新线程,想要学习的童鞋,记得关注哦。这篇文章讲解下,并发包的基本概念,为以后学习并发做铺垫,所以还是很重要的。废话少说,开撸。目录同步和异步并发和并行临界

从今天起开启一系列并发包的新线程,想要学习的童鞋,记得关注哦。

这篇文章讲解下,并发包的基本概念,为以后学习并发做铺垫,所以还是很重要的。废话少说,开撸。

目录

  • 同步和异步
  • 并发和并行
  • 临界区
  • 阻塞和非阻塞
  • 饥饿,死锁和活锁
  • 并发级别

1.同步和异步

并发包-前言
首先来说,同步和异步是基于函数/方法调用的,简单来说同步是会等待任务返回的。
而异步会立即返回,但这不代表着任务完成,他只是重新启了一个线程来执行当前任务。

2.并行和并发

并发包-前言

并发和并行,外在看起来差不多的。有图可知,并行是两个任务同时执行,而并发则是做一会任务A,过会儿切换做一会任务B。所以单核CPU不能做并行的,只能是做并发。

3.临界区

临界区是用来表示公共资源或共享数据。可以被多个线程访问,但是每一次只能有一个线程使用它,一旦临界区资源被占用,其他线程就要等待,直到该线程使用完毕,其他线程才能访问它。
并发包-前言

标题4.阻塞和非阻塞

阻塞和非阻塞是用来形容多线程之间的影响。当一个线程占用了临界区,其他线程都要等待,这就是阻塞。如果这个线程长期不释放临界区的资源,那么其他阻塞在这个临界区的线程都无法工作。非阻塞就是允许多个线程进入临界区。

所以阻塞的调度方式是一般的效率是比较低的。提倡使用非阻塞调度方式。

5.死锁、活锁和饥饿

1.死锁

并发包-前言
先看下死锁的定义

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

定义都是冰冷的,还是举个炒栗子吧_
并发包-前言
比如幼儿园里有一辆遥控玩具汽车,现在有AB两个小朋友都想玩,但是小朋友A抢到了遥控器,小朋友B抢到了汽车,两人互不想让,谁也不肯让对方先玩,这时如果没有老师介入,他俩可能就会一直这样僵持下去。这就形成了死锁。

但是虽然死锁不是什么好现象,但是死锁不会占用CPU资源,两个线程都是处于等待状态,不占CPU资源,这个一般来说,还是比较好发现的。

那如何解决死锁呢?
一般都是让线程按照同一个顺序获取资源,比如,线程1和2都先获取资源1,然后再获取资源2。这样就不会出现死锁现象了。

还说遥控汽车,解决这个问题,要预先定个规则,两个小朋友都要先去抢遥控器,抢到遥控器才能去抢汽车。这样就不会出现死锁了。

死锁说完了,来说一下活锁。

2.活锁

先看下定义

活锁指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试—失败—尝试—失败的过程。处于活锁的实体是在不断的改变状态,活锁有可能自行解开。

活锁有可能自行解开,但是不容易被发现。活锁和死锁的区别就是,活锁是动态的,占用CPU资源的,而死锁是静态的,不占用CPU资源。

再举个栗子
并发包-前言
比如有一个只能允许两人并行的小路,甲乙两人迎面相遇,他们都过于礼貌,走个迎面后,都往左一步让一步,又都往右让一步,当然可能一个给另一个人一个耳光,说,你丫是不是傻X啊!但是在这个耳光之前,他们是活锁状态,会一直这样让下去。

当然程序里也有这种例子,在这我就不举了,各位可以留言。

3.饥饿

所谓饥饿,就是一个或多个线程因为各种原因,长期得不到所需的资源,导致一直无法执行。

5.并发级别

并发级别:阻塞和非阻塞(非阻塞分为无障碍、无锁、无等待)

1.阻塞

当一个线程进入临界区时,其他的线程必须等待。

2.无障碍

特征

1)无障碍是最弱的非阻塞调度
2)线程可以***的进入临界区
3)在没有竞争时,有限步数完成操作退出
4)在有竞争时,回滚数据。

跟阻塞调度相比,阻塞调度是悲观的策略,它认为只要多个进程进行修改就会把数据改坏,所以一人得锁,其余等待。

而非阻塞调度呢,是一种乐观的策略,它认为多个进程未必会把数据改坏,所以每个线程都可以修改数据,但是当它发现数据冲突后,就会回滚这条数据。

3.无锁

与无障碍相比,无障碍调度会因为有冲突即回滚的原理,当并发量比较大的时候容易产生,每个线程调用都有冲突,每个线程都回滚,这种永远获取不到临界区的资源的情况。

而无锁呢,它增加了一个条件,保证每次竞争都有胜出者,这样就解决无障碍的问题。这样就能保证所有线程都能顺利执行下去。

无锁在Java中很常见

while (!atomicVar.compareAndSet(localVar, localVar+1)) {
localVar = atomicVar.get();
}

4.无等待

无等待是什么呢?

首先无等待的前提是在无锁的基础上的。无锁它只保证临界区有进有出,但是如果进的线程的优先级都很高,那么临界区低优先级的线程就可能一直处于饥饿状态。

无等待是并行的***别,他能使这个系统达到最优的状态。

无等待的典型案例

如果只有读没有写,那这个自然是无等待的。

如果既有读又有写,那么每个线程写之前都把数据拷贝一份,然后修改这个副本,而不是修改原始数据,所以没有冲突,那么这个修改也是无等待的。最后需要同步的只是写完之后覆盖源数据的操作。

由于无等待要求比较高,实现起来比较困难,所以多数我们会采用无锁。


推荐阅读
  • 并发编程:深入理解设计原理与优化
    本文探讨了并发编程中的关键设计原则,特别是Java内存模型(JMM)的happens-before规则及其对多线程编程的影响。文章详细介绍了DCL双重检查锁定模式的问题及解决方案,并总结了不同处理器和内存模型之间的关系,旨在为程序员提供更深入的理解和最佳实践。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • Python 异步编程:深入理解 asyncio 库(上)
    本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文详细探讨了Netty中Future及其子类的设计与实现,包括其在并发编程中的作用和具体应用场景。我们将介绍Future的继承体系、关键方法的实现细节,并讨论如何通过监听器和回调机制来处理异步任务的结果。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文详细介绍了如何在Ubuntu系统中下载适用于Intel处理器的64位版本,涵盖了不同Linux发行版对64位架构的不同命名方式,并提供了具体的下载链接和步骤。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 本文将详细介绍如何在Linux操作系统中执行PHP脚本,包括环境配置、命令使用及验证方法。对于需要在Linux环境下开发或部署PHP应用的用户来说,这是一篇非常实用的文章。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
author-avatar
遥不V可及
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有