`

Java多线程高并发基础篇(二)-并发级别

 
阅读更多

由于临界区访问的限制,所以我们需要设置并发的访问控制策略,这就是并发级别.按照并发级别的分类,大致上可以分为阻塞、无饥饿、无障碍、无锁、无等待。

Blocking(阻塞)

  1. Blocking

  2. Starvation-Free

Obstruction-Free(无障碍)

  3. Obstruction-Free

Lock-Free(无锁)

  4. Lock-Free (LF)

Wait-Free(无等待)

  5. Wait-Free (WF)

  6. Wait-Free Bounded (WFB)

  7. Wait-Free Population Oblivious (WFPO)

1.阻塞(Blocking)

在基础概念篇(一)中,我们提到了阻塞,并提到了阻塞的形成原因。在多线程高并发的情况下,使用同步锁(synchronized)或者重入锁(reentrantLock),会造成临界区外的线程形成阻塞线程。

 

2.无饥饿(Starvation-Free)

在基础概念篇(一)中,我们也说到了饥饿现象。造成饥饿的原因是线程很长时间都得不到资源(CPU资源),无法继续执行。比如,优先级较高的线程很容易得到锁,而优先级较低的线程却可能长时间都得不到执行资源。这就造成了资源使用的不公平性(后续会介绍什么是公平锁,什么是非公平锁)。无饥饿就是每个线程都可以得到系统分配的时间片去执行自己的任务.

 

3.无障碍(Obstruction-Free)

无障碍,就是在执行过程中,不会出现阻碍,不会因为临界区而形成阻塞,是非阻塞的调度。

在并发访问控制中,阻塞的调度是一种悲观的策略,因为系统会担心由于多个线程的访问,会出现共享数据不一致(所谓共享数据,就是在主内存中存放的数据,JMM-Java内存模型中线程之间通信的一种方式)。

而非阻塞调度是一种乐观的策略,因为系统认为多线程的访问不会产生冲突,或者产生冲突的概率比较小,因此允许多线程同时访问临界区,但是这很容易形成数据不一致,无障碍要求在线程执行产生冲突时,要进行数据回滚。所以说,无障碍执行并不是可以很顺畅的执行,更严重的,可能没有一个线程能顺利执行下去。

 

4.无锁(Lock-Free)

无锁的并行就是无障碍实现的一种,它规定线程必须在有限步骤内完成。在无锁的情况下,所有线程可以同时访问临界区。在高并发多线程中,CAS(Compare And Swap,比较交换)技术就是一种无锁实现.在它的实现中,使用了一个无限循环,当要修改的内容和期望内容一致时,才去做修改.因此,CAS对死锁是免疫的.在java.util.concurrent.atomic包下(在jdk的rt.jar中)的各种原子类实现,都使用了CAS技术.例如在AtomicInteger中的getAndSet(int newValue)方法.

关于CAS技术,我会专门写一片文章阐述,这里不多说.

另外,使用无锁方式,省去了线程之间竞争临界区资源锁而产生的性能损耗,也没有线程之间频繁调度带来的开销.

 

 5.无等待(Wait-Free)

无等待表示任何线程都可以在有限步骤内结束,而不必关心其他线程进度如何.进一步分类可以分为有界无等待Wait-Free Bounded (WFB)集居数无关无等待Wait-Free Population Oblivious (WFPO,外国人起的这名字也是醉了).

有界无等待:按照英文愿意,是指方法的执行过程都可以在有界限的步骤内完成,但是这个过程可能是与线程数量相关的.

集居数无关无等待(也可以叫做线程数无关无等待):在英文文献中,是这么说的--一个无等待的方法,如果其性能和活动线程数目无关,那么被称为集居数无关无等待的。

Wait-free bounded(有界无等待):

如果所有的L个线程消耗C(N,L)或者更少的时间完成操作:OpsF() < C(N,L)

Wait-free population oblivious(集居数无关无等待,在并发变成实战中翻译成了线程数无关无等待,也准确):

如果所有的L个线程在有限操作内完成F,并且和L无关:OpsF() < C(N)

其中,设F为一个函数方法,设L为同时调用F的并发线程数目,设N为一个与L无关的变量,设OpsF()代表一个指定线程完成F需要进行的操作步骤,设C(N,L)为一个依赖N和L的函数.

 

一种典型的无等待结构就是Read-Copy-Update(RCU).它的基本思想是,对数据的读可以不加控制,因此,所有的读线程都是无等待的.但是在写数据的时候,需要先取得原始数据的副本,接着修改副本数据,修改完成后,然后在合适的时机回写数据.

  • 大小: 5.1 KB
分享到:
评论

相关推荐

    Java并发编程与高并发解决方案笔记-基础篇.docx

    - **JMM**:Java内存模型定义了线程如何访问和更新共享变量,以及如何确保多线程环境下的可见性和一致性。JMM通过内存屏障和volatile、synchronized关键字来保证并发编程的安全性。 5. **并发的优势与风险** - **...

    java多线程、并发及线程池介绍收藏的几篇文档

    Java多线程、并发以及线程池是Java编程中至关重要的概念,特别是在处理高并发、高性能的系统设计时。以下是对这些主题的详细说明: 1. **Java 程序中的多线程** - 多线程允许一个程序同时执行多个任务,提高程序...

    深入Java多线程和并发编程

    本篇文章将围绕Java多线程与并发编程的核心概念和技术进行深入探讨,帮助读者建立系统的知识体系,并掌握相关的实践方法。 #### 背景介绍 随着互联网应用规模的不断扩大,现代应用面临着高并发请求、CPU密集型操作...

    Java多线程之基础篇(二).docx

    Java 多线程是Java语言中的一个重要特性,...总的来说,Java多线程编程涉及许多概念和机制,包括线程创建、同步、通信、异常处理等。理解和熟练掌握这些知识点是开发高并发应用的基础,也是提升Java程序员技能的关键。

    JAVAJAVA多线程教学演示系统论文

    总的来说,《JAVA多线程教学演示系统》这篇论文不仅是对JAVA多线程技术的理论探讨,更是一个实践与教学相结合的优秀范例,对于提升学生的多线程编程能力具有很高的参考价值。VB图书管理系统论文范文虽不在本文讨论...

    Java多线程编程实战指南 设计模式篇.rar

    Java多线程编程与设计模式的结合,能够帮助开发者构建高性能、高可用性的并发应用。理解并熟练掌握这些知识点,是每个Java程序员进阶的必经之路。通过阅读"Java多线程编程实战指南 设计模式篇.pdf",你将获得更深入...

    深入浅出Java多线程.pdf

    本PDF文档涉及了Java多线程的全面介绍,分为基础篇、原理篇和JDK工具篇三个部分,旨在帮助读者深入了解Java多线程的概念、原理及实践应用。 #### 基础篇 **1. 进程与线程基本概念** - **进程**:是程序的一次执行...

    Java多线程编程实战指南核新篇&设计篇&以及和核新篇的案例代码

    核心篇主要讲解了Java多线程的基础概念,包括线程的创建与启动、线程同步机制如synchronized关键字、wait()、notify()和notifyAll()方法、线程间通信的并发工具类如Semaphore、CyclicBarrier、CountDownLatch等。...

    JAVA多线程总结

    本篇总结涵盖了Java多线程的基础概念、创建与启动、线程调度、同步与协作以及新特性。 **一、Java线程:概念与原理** 1. **线程与进程**: - **进程**:是操作系统资源分配的基本单位,每个进程都有独立的内存...

    深入理解高并发编程-核心技术原理

    总的来说,这本书全面覆盖了高并发编程中的关键知识点,包括多线程原理、线程池实现、并发控制、分布式系统架构以及面试技巧,适合有志于提升并发编程能力的后端开发者阅读,尤其是对分布式锁和Java并发编程感兴趣的...

    13-Java并发编程学习宝典.zip

    慕课专栏.html" 和 "25 经典并发容器,多线程面试必备—深入解析ConcurrentHashMap下-慕课专栏.html":这两篇文章深入探讨了Java并发容器中的`ConcurrentHashMap`,它是线程安全的哈希映射,适用于高并发环境。...

    Java-jdk10-最新最全多线程编程实战指南-核心篇

    通过阅读《Java-jdk10-最新最全多线程编程实战指南-核心篇》这本书,开发者不仅可以理解Java多线程编程的基础知识,还能掌握高级并发编程技巧,从而在实际项目中实现高性能、高并发的程序设计。对于Java开发者来说,...

    实战Java高并发程序设计模式

    在Java编程领域,高并发程序设计是至关重要的一个部分,特别是在大数据处理、互联网服务和分布式系统中。"实战Java高并发程序设计模式"的主题旨在帮助开发者掌握如何在高并发环境中有效地设计和实现高效的程序。本篇...

    多线程编程实战指南-核心篇

    总之,《多线程编程实战指南-核心篇》是一本全面解析Java多线程编程的书籍,通过学习,开发者不仅可以掌握多线程编程的基本原理,还能学会如何在实际项目中应用这些知识,提升程序的并发性能和稳定性。对于有一定...

    多线程两种实现方式Java

    你可以通过运行这些示例来更好地理解和学习Java多线程的概念。例如,它可能包含一个继承`Thread`的类,一个实现`Runnable`的类,以及演示如何启动和管理这些线程的主程序。 总结,理解并熟练掌握Java中的多线程实现...

    Java技术教程--基础篇

    本教程“Java技术教程--基础篇”旨在为初学者提供一个全面的Java学习平台,帮助他们掌握Java编程的基础概念和技能。教程内容涵盖Java的核心特性,包括图形用户界面(GUI)、线程管理和网络通信。 首先,我们来深入...

    JAVA程序员必读--基础篇chm

    10. **多线程**:Java内置了对多线程的支持,通过实现Runnable接口或继承Thread类,可以创建并发执行的任务,提高程序的效率。 11. **反射**:反射机制允许在运行时动态地获取类的信息并创建或操作对象,是Java的...

    Java多线程优化百万级数据

    本篇将深入探讨如何利用Java多线程技术来优化这种高负载场景。 首先,理解Java多线程的基础至关重要。在Java中,线程是程序执行的最小单元,可以通过实现`Runnable`接口或继承`Thread`类来创建线程。创建多线程的...

Global site tag (gtag.js) - Google Analytics