热门标签 | 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.无等待

无等待是什么呢?

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

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

无等待的典型案例

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

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

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


推荐阅读
  • 深入探讨:Actor模型如何解决并发与分布式计算难题
    在现代软件开发中,高并发和分布式系统的设计面临着诸多挑战。本文基于Akka最新文档,详细探讨了Actor模型如何有效地解决这些挑战,并提供了对并发和分布式计算的新视角。 ... [详细]
  • 本文基于Java官方文档进行了适当修改,旨在介绍如何实现一个能够同时处理多个客户端请求的服务端程序。在前文中,我们探讨了单客户端访问的服务端实现,而本篇将深入讲解多客户端环境下的服务端设计与实现。 ... [详细]
  • 探索Java 11中的ZGC垃圾收集器
    Java 11引入了一种新的垃圾收集器——ZGC,由Oracle公司研发,旨在支持TB级别的内存容量,并保证极低的暂停时间。本文将探讨ZGC的开发背景、技术特点及其潜在的应用前景。 ... [详细]
  • 本文探讨了如何利用RxJS库在AngularJS应用中实现对用户单击和拖动操作的精确区分,特别是在调整区域大小的场景下。 ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • 本文介绍了在Linux环境下如何有效返回命令行状态、上一级目录及快速查找头文件和函数定义的方法。包括处理长时间运行命令、编辑器退出技巧、目录导航以及文件搜索策略。 ... [详细]
  • 汇编语言:编程世界的始祖,连C语言都敬畏三分!
    当C语言还在萌芽阶段时,它首次接触到了汇编语言,并对其简洁性感到震惊。尽管汇编语言的指令极其简单,但它却是所有现代编程语言的基础,其重要性不言而喻。 ... [详细]
  • 本文探讨了Java中线程的多种终止方式及其状态转换,提供了关于如何安全有效地终止线程的指导。 ... [详细]
  • 协程作为一种并发设计模式,能有效简化Android平台上的异步代码处理。自Kotlin 1.3版本引入协程以来,这一特性基于其他语言的成熟理念,为开发者提供了新的工具,以增强应用的响应性和效率。 ... [详细]
  • Spring Security基础配置详解
    本文详细介绍了Spring Security的基础配置方法,包括如何搭建Maven多模块工程以及具体的安全配置步骤,帮助开发者更好地理解和应用这一强大的安全框架。 ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • 深入理解线程池及其基本实现
    本文探讨了线程池的概念、优势及其在Java中的应用。通过实例分析不同类型的线程池,并指导如何构建一个简易的线程池。 ... [详细]
  • Asynchronous JavaScript and XML (AJAX) 的流行很大程度上得益于 Google 在其产品如 Google Suggest 和 Google Maps 中的应用。本文将深入探讨 AJAX 在 .NET 环境下的工作原理及其实现方法。 ... [详细]
  • 为何Compose与Swarm之后仍有Kubernetes的诞生?
    探讨在已有Compose和Swarm的情况下,Kubernetes是如何以其独特的设计理念和技术优势脱颖而出,成为容器编排领域的领航者。 ... [详细]
  • 流处理中的计数挑战与解决方案
    本文探讨了在流处理中进行计数的各种技术和挑战,并基于作者在2016年圣何塞举行的Hadoop World大会上的演讲进行了深入分析。文章不仅介绍了传统批处理和Lambda架构的局限性,还详细探讨了流处理架构的优势及其在现代大数据应用中的重要作用。 ... [详细]
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社区 版权所有