广告
返回顶部
首页 > 资讯 > 后端开发 > Python >java高并发的并发级别详解
  • 286
分享到

java高并发的并发级别详解

2024-04-02 19:04:59 286人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录阻塞无饥饿(Starvation-Free)无障碍(Obstruction-Free)无锁(Lock-Free)等待总结阻塞、无饥饿、无障碍、无锁、无等待几种。 阻塞 一个线程是

阻塞、无饥饿、无障碍、无锁、无等待几种。

阻塞

一个线程是阻塞的,那么在其他线程释放资源之前,当前线程无法继续执行。当我们使用synchronized关键字或者重入锁时,我们得到的就是阻塞的线程。

synchronize关键字和重入锁都试图在执行后续代码前,得到临界区的锁,如果得不到,线程就会被挂起等待,直到占有了所需资源为止。

无饥饿(Starvation-Free)

如果线程之间是有优先级的,那么线程调度的时候总是会倾向于先满足高优先级的线程。也就是说,对于同一个资源的分配,是不公平的!图1.7中显示了非公平锁与公平锁两种情况(五角星表示高优先级线程)。对于非公平锁来说,系统允许高优先级的线程插队。这样有可能导致低优先级线程产生饥饿。但如果锁是公平的,按照先来后到的规则,那么饥饿就不会产生,不管新来的线程优先级多高,要想获得资源,就必须乖乖排队,这样所有的线程都有机会执行。

640?wx_fmt=png

无障碍(Obstruction-Free)

无障碍是一种最弱的非阻塞调度。两个线程如果无障碍地执行,那么不会因为临界区的问题导致一方被挂起。换言之,大家都可以大摇大摆地进入临界区了。那么大家一起修改共享数据,把数据改坏了怎么办呢?对于无障碍的线程来说,一旦检测到这种情况,它就会立即对自己所做的修改进行回滚,确保数据安全。但如果没有数据竞争发生,那么线程就可以顺利完成自己的工作,走出临界区。

如果说阻塞的控制方式是悲观策略,也就是说,系统认为两个线程之间很有可能发生不幸的冲突,因此以保护共享数据为第一优先级,相对来说,非阻塞的调度就是一种乐观的策略。它认为多个线程之间很有可能不会发生冲突,或者说这种概率不大。因此大家都应该无障碍地执行,但是一旦检测到冲突,就应该进行回滚。

从这个策略中也可以看到,无障碍的多线程程序并不一定能顺畅运行。因为当临界区中存在严重的冲突时,所有的线程可能都会不断地回滚自己的操作,而没有一个线程可以走出临界区。这种情况会影响系统的正常执行。所以,我们可能会非常希望在这一堆线程中,至少可以有一个线程能够在有限的时间内完成自己的操作,而退出临界区。至少这样可以保证系统不会在临界区中进行无限的等待。

一种可行的无障碍实现可以依赖一个"一致性标记"来实现。线程在操作之前,先读取并保存这个标记,在操作完成后,再次读取,检查这个标记是否被更改过,如果两者是一致的,则说明资源访问没有冲突。如果不一致,则说明资源可能在操作过程中与其他线程冲突,需要重试操作。而任何对资源有修改操作的线程,在修改数据前,都需要更新这个一致性标记,表示数据不再安全。

数据库中乐观锁,应该比较熟悉,表中需要一个字段version(版本号),每次更新数据version+1,更新的时候将版本号作为条件进行更新,根据更新影响的行数判断更新是否成功,伪代码如下:


1.查询数据,此时版本号为w_v	
2.打开事务	
3.做一些业务操作	
4.update t set version = version+1 where id = 记录id and version = w_v;//此行会返回影响的行数c	
5.if(c>0){	
        //提交事务	
    }else{	
        //回滚事务	
    }

多个线程更新同一条数据的时候,数据库会对当前数据加锁,同一时刻只有一个线程可以执行更新语句。

无锁(Lock-Free)

无锁的并行都是无障碍的。在无锁的情况下,所有的线程都能尝试对临界区进行访问,但不同的是,无锁的并发保证必然有一个线程能够在有限步内完成操作离开临界区。

在无锁的调用中,一个典型的特点是可能会包含一个无穷循环。在这个循环中,线程会不断尝试修改共享变量。如果没有冲突,修改成功,那么程序退出,否则继续尝试修改。但无论如何,无锁的并行总能保证有一个线程是可以胜出的,不至于全军覆没。至于临界区中竞争失败的线程,他们必须不断重试,直到自己获胜。如果运气很不好,总是尝试不成功,则会出现类似饥饿的先写,线程会停止。

下面就是一段无锁的示意代码,如果修改不成功,那么循环永远不会停止。


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

等待

无锁只要求有一个线程可以在有限步内完成操作,而无等待则在无锁的基础上更进一步扩展。它要求所有线程都必须在有限步内完成,这样不会引起饥饿问题。如果限制这个步骤的上限,还可以进一步分解为有界无等待和线程数无关的无等待等几种,他们之间的区别只是对循环次数的限制不同。

一种典型的无等待结果就是RCU(Read Copy Update)。它的基本思想是,对数据的读可以不加控制。因此,所有的读线程都是无等待的,它们既不会被锁定等待也不会引起任何冲突。但在写数据的时候,先获取原始数据的副本,接着只修改副本数据(这就是为什么读可以不加控制),修改完成后,在合适的时机回写数据。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: java高并发的并发级别详解

本文链接: https://www.lsjlt.com/news/155549.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java高并发的并发级别详解
    目录阻塞无饥饿(Starvation-Free)无障碍(Obstruction-Free)无锁(Lock-Free)等待总结阻塞、无饥饿、无障碍、无锁、无等待几种。 阻塞 一个线程是...
    99+
    2022-11-12
  • java高并发中并发级别的示例分析
    这篇文章给大家分享的是有关java高并发中并发级别的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。阻塞一个线程是阻塞的,那么在其他线程释放资源之前,当前线程无法继续执行。当我们使用synchronized...
    99+
    2023-06-25
  • 高并发级别简述
    术语说明:QPS = req/sec = 请求数/秒QPS: 每秒钟处理完请求的次数;注意这里是处理完。具体是指发出请求到服务器处理完成功返回结果。可以理解在server中有个counter,每处理一个请求加1,1秒后counter=QPS...
    99+
    2023-06-02
  • java的多线程高并发详解
    目录1.JMM数据原子操作2.来看volatile关键字3.并发编程三大特性4.双锁判断机制创建单例模式5.synchronized关键字6.AtomicIntger原子操作7.锁优...
    99+
    2022-11-12
  • Java 并发 - ThreadLocal详解
    ThreadLocal是通过线程隔离的方式防止任务在共享资源上产生冲突, 线程本地存储是一种自动化机制,可以为使用相同变量的每个不同线程都创建不同的存储。 @pdaiJava 并发 - ThreadLocal详解带着BAT大厂的面试问题去理...
    99+
    2022-12-02
    java框架 java全栈 java学习路线 java全栈知识 java面试 知识体系 java技术体系 java编程
  • Java高并发之CyclicBarrier的用法详解
    目录使用方式注意事项总结Java 中的 CyclicBarrier 是一种同步工具,它可以让多个线程在一个屏障处等待,直到所有线程都到达该屏障处后,才能继续执行。CyclicBarr...
    99+
    2023-03-13
    Java高并发CyclicBarrier Java高并发 Java CyclicBarrier
  • 详解Java高并发编程之AtomicReference
    目录一、AtomicReference 基本使用1.1、使用 synchronized 保证线程安全性二、了解 AtomicReference2.1、使用 AtomicReferen...
    99+
    2022-11-12
  • java高并发之线程组详解
    目录线程组创建线程关联线程组为线程组指定父线程组根线程组批量停止线程总结线程组 我们可以把线程归属到某个线程组中,线程组可以包含多个线程以及线程组,线程和线程组组成了父子关系,是个树...
    99+
    2022-11-12
  • java并发编程详解
    一.synchronized的缺陷synchronized是java中的一个关键字,也就是说是Java语言内置的特性。那么为什么会出现Lock呢?如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,并执行该代码块时,其...
    99+
    2016-07-17
    java
  • Java高并发测试框架JCStress详解
    前言 如果要研究高并发,一般会借助高并发工具来进行测试。JCStress(Java Concurrency Stress)它是OpenJDK中的一个高并发测试工具,它可以帮助我们研...
    99+
    2022-11-12
  • java高并发ScheduledThreadPoolExecutor与Timer区别
    目录正文二者的区别线程角度系统时间敏感度是否捕获异常任务是否具备优先级是否支持对任务排序能否获取返回的结果二者简单的示例Timer类简单示例ScheduledThreadPoolEx...
    99+
    2022-11-13
    java高并发ScheduledThreadPoolExecutor Timer java 高并发
  • java高并发的volatile与Java内存模型详解
    public class Demo09 { public static boolean flag = true; public static class T1...
    99+
    2022-11-12
  • Java 高并发的三种实现案例详解
    提到锁,大家肯定想到的是sychronized关键字。是用它可以解决一切并发问题,但是,对于系统吞吐量要求更高的话,我们这提供几个小技巧。帮助大家减小锁颗粒度,提高并发能力。 初级技...
    99+
    2022-11-12
  • Java 浅谈 高并发 处理方案详解
    目录高性能开发十大必须掌握的核心技术I/O优化:零拷贝技术I/O优化:多路复用技术线程池技术无锁编程技术进程间通信技术Scale-out(横向拓展)缓存异步高性能、高可用、高拓展 解...
    99+
    2022-11-12
  • Java进阶之高并发核心Selector详解
    目录一、Selector设计二、获取Selector三、EPollSelector如何进行select3.1 Epoll fd的创建3.2 Epoll wait等待内核IO...
    99+
    2022-11-12
  • 详解Java并发编程中的优先级队列PriorityBlockingQueue
    目录一、PriorityBlockingQueue概述二、PriorityBlockingQueue源码解析1.容器2.比较器3.构造函数4.添加元素5.获取元素6.维护堆性质总结P...
    99+
    2023-05-18
    Java并发编程PriorityBlockingQueue Java PriorityBlockingQueue队列 Java PriorityBlockingQueue
  • java高并发处理 java处理高并发的几种方法
    一、背景综述         并发就是可以使用多个线程或进程,同时处理(就是并发)不同的操作。         高并发的时候就是有很多用户在访问,导致系统数据不正确、糗事数据的现象。对于一些大型网站,比如门户网站,在面对大量用户访问、高并发...
    99+
    2023-09-22
    java
  • java高并发之线程的基本操作详解
    目录新建线程终止线程线程中断等待(wait)和通知(notify)挂起(suspend)和继续执行(resume)线程等待线程结束(join)和谦让(yeild)总结新建线程 新建线...
    99+
    2022-11-12
  • 详解Java多线程与并发
    目录一、进程与线程二、并发与并行1、线程安全问题2、共享内存不可见性问题三、创建线程1、继承Thread类2、实现Runable接口3、实现Callable接口四、Thread类详解...
    99+
    2022-11-12
  • java ReentrantLock并发锁使用详解
    目录一、ReentrantLock是什么1-1、ReentrantLock和synchronized区别1-2、ReentrantLock的使用1-2-1、ReentrantLock...
    99+
    2022-11-13
    java ReentrantLock并发锁 java ReentrantLock
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作