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

无等待是什么呢?

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

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

无等待的典型案例

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

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

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


推荐阅读
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 关于CMS收集器的知识介绍和优缺点分析
    本文介绍了CMS收集器的概念、运行过程和优缺点,并解释了垃圾回收器的作用和实践。CMS收集器是一种基于标记-清除算法的垃圾回收器,适用于互联网站和B/S系统等对响应速度和停顿时间有较高要求的应用。同时,还提供了其他垃圾回收器的参考资料。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Java虚拟机中的垃圾收集器,包括年轻代收集器Serial收集器、ParNew收集器、Parallel Scavenge收集器,以及老年代收集器Serial Old收集器、Parallel Old收集器和CMS收集器。对每种收集器的算法和特点进行了详细解析,希望对读者有参考价值。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 1Lock与ReadWriteLock1.1LockpublicinterfaceLock{voidlock();voidlockInterruptibl ... [详细]
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社区 版权所有