【并发缺陷】data race数据竞争、atomicity violation原子违背、order violation顺序违背

【并发缺陷】data race数据竞争、atomicity violation原子违背、order violation顺序违背三类均是跟共享变量的内存访问有关的缺陷。对于并发缺陷的分类目前国内许多是分死锁、数据竞争、原子违背、顺序违背。或者在并发缺陷中又细分concurrencyvulnerability:死锁和数据竞争。感觉各个作者有自己的分类方法????以下引用的中文解释来自<并发缺陷暴露、检测与规避研究综述>哈工大的苏小红老师实验室发表在2015年计算机学报上目前找到外文文献分为7类。其他四类…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

三类均是跟共享变量的内存访问有关的缺陷。
对于并发缺陷的分类目前国内许多是分死锁、数据竞争、原子违背、顺序违背。
在这里插入图片描述或者在并发缺陷中又细分 concurrency vulnerability :死锁和数据竞争。
感觉各个作者有自己的分类方法?

以下引用的中文解释来自<并发缺陷暴露、检测与规避研究综述>哈工大的苏小红老师实验室发表在2015年计算机学报上

目前找到外文文献分为7类。其他四类是我上篇说的死锁(Deadlock)、活锁(LiveLock)、饥饿(Starvation)、挂起(Suspension)

data race数据竞争

race condition竞用条件:

  1. 并发线程在同一个内存地址上操作
  2. 其中至少一个是写操作
  3. 内存没有使用同步机制

注意:满足竞用条件时,不一定产生数据竞争。
Data race occurs when at least two threads access the same memory location , with at least one of them writing data to that location and these accesses are not protected by locks
谷歌翻译: 当至少两个线程访问同一内存位置时发生数据争用,其中至少一个线程将数据写入该位置,并且这些访问不受锁的保护
中文解释: 对某一共享内存单元,存在来自不同线程的两个并发访问,且至少一个为写访问.并发意指这两个访问之间没有happens-before关系,存在“同时”发生的可能.

happens-before:
Chapter 17 of the Java Language Specification defines the happens-before relation on memory operations such as reads and writes of shared variables. The results of a write by one thread are guaranteed to be visible to a read by another thread only if the write operation happens-before the read operation. The synchronized and volatile constructs, as well as the Thread.start() and Thread.join() methods, can form happens-before relationships.

atomicity violation原子违背

Atomicity violation occurs when the execution of two code blocks(sequences of statements protected by locks) in one thread is concurrency overlapping with the execution of one or more code blocks of other threads ,in such a way that the resulting content of memory cannot be achieved by executing the involved blocks in any non-overlapping order.
谷歌翻译: 当一个线程中的两个代码块(受锁保护的语句序列)的执行与其他线程的一个或多个代码块的执行并发重叠时,就会发生原子性冲突,以这样一种方式,使得不能通过以任何非重叠的顺序执行代码块来实现所得到的存储器内容。
中文解释: 对某一为保证正确性必须原子性执行的指令序列,存在一个执行交错,其执行效果不与任何该指令序列原子性执行时的执行交错的效果相同.

单变量的四种原子性违背的例子
【并发缺陷】data race数据竞争、atomicity violation原子违背、order violation顺序违背
T1两次读值不一致;T2写的值被覆盖; T1读值不一致 ; T2读到了中间值

在这里插入图片描述
解释:正确顺序L1-L2-L3 判断缓冲区剩余是否够,不够就加,之后写入。错误顺序L1-L3-L2使得缓冲区还未扩容便填充,造成缓冲区溢出。
在这里插入图片描述
解释:指针指向proc_info后,再写入数据,S3造成空指针异常NPD

order violation顺序违背

Order violation occurs when the expected order of at least two memory accesses is not respected, i.e., the programmer’s intended order of execution is not enforced. 两个存储访问的顺序违反
谷歌翻译: 如果不遵守至少两次内存访问的预期顺序,即不执行程序员的预期执行顺序,则会发生顺序冲突。
中文解释: 顺序违背.某一指令(组)没有按照预期,总是在另一指令(组)之前或者之后执行.
消除顺序违背的措施一般是使用条件变量在指令(组)之间形成固定的执行次序.
在这里插入图片描述
解释:thread1初始化io_pending S4必须在S2之后执行
在这里插入图片描述
解释:需要先初始化在操作,造成Use before init缺陷

三者区别

data race order violation atomicity violation
至少一个线程在等待状态
至少一个线程执行状态
所有线程都在执行态
产生错误、或非预期结果
至少一个线程持有锁
不同的线程访共享内存
至少一个内存访问操作是写
内存访问没有同步机制保护
在内存访问中,至少有一个正确的执行顺序没有被保证
序列需要被原子执行
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/223086.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 运算符的优先级(从高到低)

    运算符的优先级(从高到低)java运算符优先级记忆口诀尊重原创:(口诀)转自http://lasombra.iteye.com/blog/991662     今天看到《java编程思想》中的运算符优先级助记口诀,不过“Ulcer Addicts Really Like C A lot”在中文语境下不好记。我试着写一个口诀: 单目乘除为关系,逻辑三目后赋值。 单目:单目运算符+ –(负数) ++ — 等 乘…

  • 工厂+策略解决多重if-else

    工厂+策略解决多重if-else

  • post-layout时序仿真_padstart

    post-layout时序仿真_padstartString.prototype.padStart把指定字符串填充到字符串头部,返回新字符串。语法str.padStart(targetLength[,padString])targetLength当前字符串需要填充到的目标长度。如果这个数值小于当前字符串的长度,则返回当前字符串本身。padString可选填充字符串。如果字符串太长,使填充后的字符串长度超过了目标长度,则只保留最左侧的部分,其他部分会被截断。此参数的默认值为””示例’abc’.padStart(10);

  • uwsgi停止[通俗易懂]

    uwsgi停止[通俗易懂]uwsgi停止和nginx配置uwsgi停止nginx配置uwsgi停止必须在uwsgi.ini中配置好pidfile=绝对路径///uwsgi.pid这样才有pid文件uwsgi–stopuwsgi.pid这样就可以停止了有一点需要注意:如果没有uwsgi.pid又需要停止uwsgi服务可以netstat…

  • java在Socket传输中文乱码解决思路及代码「建议收藏」

    java在Socket传输中文乱码解决思路及代码「建议收藏」中文乱码产生的原因就是从GBK转到UTF-8,或者是不同的编码格式来回转,导致byte[]中存放的字节丢失。思路是:在客户端进行传输前,将需要传输的字节,以一个编码方式进行传输,假设设置GBK,之后在服务端接收到后,先使用newString(byte,“GBK”);去接收,这样只要保证传输时候设置的编码格式和接收的时候设置的编码格式就不会乱码。案例:对方要发报文,报文头中存在编码格式解决方案:publicstaticStringgetCharsetName(byte[]bytes){

  • js nextSibling函数「建议收藏」

    js nextSibling函数「建议收藏」<!DOCTYPEhtml><html><head><metacharset=”utf-8″><title>菜鸟教程(runoob.com)</title><scriptsrc=”https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js”>&…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号