本系列基于炼数成金课程,为了更好的学习,做了系列的记录。本文主要介绍 1.高并发的概念,为以后系列知识做铺垫。 2.两个重要的定理
1、关于高并发的几个重要概念
1.1 同步和异步
首先这里说的同步和异步是指函数/方法调用方面。
很明显,同步调用会等待方法的返回,异步调用会瞬间返回,但是异步调用瞬间返回并不代表你的任务就完成了,他会在后台起个线程继续进行任务。
1.2 并发和并行
并发和并行在外在表象来说,是差不多的。由图所示,并行则是两个任务同时进行,而并发呢,则是一会做一个任务一会又切换做另一个任务。所以单个cpu是不能做并行的,只能是并发。
1.3 临界区
临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用,但是每一次,只能有一个线程使用它,一旦临界区资源被占用,其他线程要想使用这个资源,就必须等待。
1.4 阻塞和非阻塞
- 阻塞和非阻塞通常形容多线程间的相互影响。比如一个线程占用了临界区资源,那么其它所有需要这个资源的线程就必须在这个临界区中进行等待,等待会导致线程挂起。这种情况就是阻塞。此时,如果占用资源的线程一直不愿意释放资源,那么其它所有阻塞在这个临界区上的线程都不能工作。
- 非阻塞允许多个线程同时进入临界区
所以阻塞的方式,一般性能不会太好。根据一般的统计,如果一个线程在操作系统层面被挂起,做了上下文切换了,通常情况需要8W个时间周期来做这个事情。
1.5 死锁、饥饿、活锁
所谓死锁:是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。就如同下图中的车都想前进,却谁都无法前进。
但是死锁虽说是不好的现象,但是它是一个静态的问题,一旦发生死锁,进程被卡死,cpu占有率也是0,它不会占用cpu,它会被调出去。相对来说还是比较好发现和分析的。
与死锁相对应的是活锁。
活锁,指事物1可以使用资源,但它让其他事物先使用资源;事物2可以使用资源,但它也让其他事物先使用资源,于是两者一直谦让,都无法使用资源。
举个例子,就如同你在街上遇到个人,刚好他朝着你的反方向走,与你正面碰到,你们都想让彼此过去。你往左边移,他也往左边移,两人还是无法过去。这时你往右边移,他也往右边移,如此循环下去。
一个线程在取得了一个资源时,发现其他线程也想到这个资源,因为没有得到所有的资源,为了避免死锁把自己持有的资源都放弃掉。如果另外一个线程也做了同样的事情,他们需要相同的资源,比如A持有a资源,B持有b资源,放弃了资源以后,A又获得了b资源,B又获得了a资源,如此反复,则发生了活锁。
活锁会比死锁更难发现,因为活锁是一个动态的过程。
饥饿是指某一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执行。
1.6 并发级别
并发级别:阻塞和非阻塞(非阻塞分为无障碍、无锁、无等待)
1.6.1 阻塞
当一个线程进入临界区后,其他线程必须等待
1.6.2 无障碍
- 无障碍是一种最弱的非阻塞调度
- 自由出入临界区
- 无竞争时,有限步内完成操作
- 有竞争时,回滚数据
和非阻塞调度相比呢,阻塞调度是一种悲观的策略,它会认为说一起修改数据是很有可能把数据改坏的。而非阻塞调度呢,是一种乐观的策略,它认为大家修改数据未必把数据改坏。但是它是一种宽进严出的策略,当它发现一个进程在临界区内发生了数据竞争,产生了冲突,那么无障碍的调度方式则会回滚这条数据。
在这个无障碍的调度方式当中,所有的线程都相当于在拿去一个系统当前的一个快照。他们一直会尝试拿去的快照是有效的为止。
1.6.3 无锁
- 是无障碍的
- 保证有一个线程可以胜出
与无障碍相比,无障碍并不保证有竞争时一定能完成操作,因为如果它发现每次操作都会产生冲突,那它则会不停地尝试。如果临界区内的线程互相干扰,则会导致所有的线程会卡死在临界区,那么系统性能则会有很大的影响。
而无锁增加了一个新的条件,保证每次竞争有一个线程可以胜出,则解决了无障碍的问题。至少保证了所有线程都顺利执行下去。
下面代码是Java中典型的无锁计算代码
无锁在Java中很常见
1
2
3
4
|
while (!atomicVar.compareAndSet(localVar, localVar+ 1 ))
{ localVar = atomicVar.get();
} |
1.6.4 无等待
- 无锁的
- 要求所有的线程都必须在有限步内完成
- 无饥饿的
首先无等待的前提是无锁的基础上的,无锁它只保证了临界区肯定有进也有出,但是如果进的优先级都很高,那么临界区内的某些优先级低的线程可能发生饥饿,一直出不了临界区。那么无等待解决了这个问题,它保证所有的线程都必须在有限步内完成,自然是无饥饿的。
无等待是并行的最高级别,它能使这个系统达到最优状态。
无等待的典型案例:
如果只有读线程,没有线线程,那么这个则必然是无等待的。
如果既有读线程又有写线程,而每个写线程之前,都把数据拷贝一份副本,然后修改这个副本,而不是修改原始数据,因为修改副本,则没有冲突,那么这个修改的过程也是无等待的。最后需要做同步的只是将写完的数据覆盖原始数据。
由于无等待要求比较高,实现起来比较困难,所以无锁使用得会更加广泛一些。
2. 有关并行的两个重要定律
这两个定律都与加速比有关
2.1 Amdahl定律
定义了串行系统并行化后的加速比的计算公式和理论上限
加速比定义:加速比=优化前系统耗时/优化后系统耗时
举个例子:
加速比=优化前系统耗时/优化后系统耗时=500/400=1.25
这个定理表明:增加CPU处理器的数量并不一定能起到有效的作用 提高系统内可并行化的模块比重,合理增加并行处理器数量,才能以最小的投入,得到最大的加速比。
2.2 Gustafson定律
说明处理器个数,串行比例和加速比之间的关系
则加速比=n-F(n-1) //推导过程略
只要有足够的并行化,那么加速比和CPU个数成正比
相关推荐
Java高并发编程是Java开发中不可或缺的一部分,尤其在大规模分布式系统设计中,处理高并发问题至关重要。本篇文章将从基础知识出发,对高并发的核心概念进行深入解析,为后续的学习打下坚实的基础。 首先,我们要...
大厂学院高阶班java并发编程面试视频资料(6.95G) 〖课程介绍〗: 大厂学院高阶班java并发编程面试视频资料(6.95G) 〖课程目录〗: 01_前言.mp4 44.96M 02_线程的start方法.mp4 68.78M 03_进程线程管程.mp4 54.58M ...
并发编程的艺术作为一本探讨Java并发技术的书籍,通过深入剖析Java并发框架、线程池的实现原理以及JVM和CPU层面的相关知识,旨在帮助读者深入理解并发编程技术,并掌握如何在实际应用中解决并发编程所带来的挑战。...
- **高性能**:虽然Java是一种解释性语言,但其性能优化技术使其接近于编译型语言。 - **简单性**:Java语言设计简洁明了,易于学习和使用。 - **健壮性**:Java拥有严格的错误检测机制,有助于开发健壮的应用程序。...
#### 一、前言及背景 JNI(Java Native Interface)是Sun Microsystems公司定义的一套标准接口,用于实现Java代码与本地代码(通常是C或C++)之间的交互。随着Java的发展,JNI的重要性日益凸显,因为它允许Java程序...
`FutureTask`是Java并发编程中非常重要的一个类,它是`Future`接口的一个具体实现。通常用于处理异步计算任务的结果。当多个线程并行执行时,`FutureTask`可以帮助我们收集这些线程的计算结果,并最终整合为一个整体...
因此书中不仅提供了理论知识,还分享了构建线程安全组件时需要注意的实践技巧和模式,以及在高并发环境下如何进行性能优化。 Java并发编程主要面临的挑战包括线程安全问题、死锁、线程饥饿和资源竞争等问题。Java...
非阻塞I/O允许程序在等待数据时执行其他任务,提高了系统资源的利用率,特别适用于高并发的网络环境。 06-Java安全通信与安全套接字SSL.ppt讲解了如何使用Java进行安全的网络通信,包括SSL/TLS协议,这对于涉及敏感...
前言.pdf通常会包含作者的序言,介绍书籍的编写背景、目的以及读者定位,同时也可能会概述全书的主要内容和章节结构,为读者提供一个整体的学习指南。 总之,《Java实用系统开发指南》是一本全面而深入的Java学习...
《Think in Java 3e 中文版》全面涵盖了类、对象、接口、多态、异常处理、集合框架、IO流、网络编程、并发处理等Java的核心概念,同时结合实际案例,让读者能够在实践中理解理论。此外,书中还讨论了设计模式和泛型...
《深入Java虚拟机》(Inside the Java Virtual Machine) 是一本深入了解Java编程语言核心以及Java虚拟机(JVM)工作原理的经典书籍。这本书分为第一版和第二版,分别提供了当时最新的JVM技术解析。 首先,我们要了解...
首先,安全性是Java 11的一大关注点。它提供了最新的安全更新,包括安全协议升级和安全漏洞的修复,这对于那些将Java作为核心基础设施的企业至关重要。此外,Java 11还引入了许多新特性、错误修复,以及针对GC(垃圾...
#### 前言:聚焦Java核心知识点 本书《Java宝典》旨在帮助读者深入理解Java的核心技术,包括JVM、类加载机制、多线程处理、网络编程、非阻塞I/O(NIO)、性能优化以及安全等方面。这些都是在Java面试中经常被提及的...
随着互联网的发展,越来越多的应用程序需要处理高并发的网络连接请求。传统的阻塞I/O模型在面对大量并发连接时存在明显的性能瓶颈,为了解决这一问题,Java NIO(New Input/Output)应运而生。 #### 一、Java NIO与...
#### 一、前言与背景介绍 随着2017年的到来,许多IT行业的求职者开始准备新一轮的技术面试。本文档旨在帮助那些准备参加2017年Java互联网面试的朋友,通过提供一系列关键知识点的梳理,帮助他们更好地应对即将到来的...
- **前言**:简要介绍了本书的目的、适用对象以及学习Java的方法论。 - **第1章:Java简介**:概述了Java的历史、特点以及为何选择Java作为开发工具。此章节还介绍了如何安装Java开发环境、如何编写第一个Java程序等...
此外, chap9.pdf 可能讲解了多线程和并发,这是Java的一个强大特性,用于编写高效、响应迅速的应用。 5. **设计模式**:设计模式是软件工程中的最佳实践, chap11.pdf 可能会详细讨论一些常见的设计模式,如工厂...