多线程 竞态条件与临界区 傷城~ 2022-06-06 00:10 177阅读 0赞 ### 竞态条件与临界区 ### 在同一程序中运行多个线程本身不会导致问题,问题在于多个线程访问了相同的资源。如,同一内存区(变量,数组,或对象)、系统(数据库,web services等)或文件。实际上,这些问题只有在一或多个线程向这些资源做了写操作时才有可能发生,只要资源没有发生变化,多个线程读取相同的资源就是安全的。 多线程同时执行下面的代码可能会出错: public class Counter { protected long count = 0; public void add(long value){ this.count = this.count + value; } } 想象下线程A和B同时执行同一个Counter对象的add()方法,我们无法知道操作系统何时会在两个线程之间切换。JVM并不是将这段代码视为单条指令来执行的,而是按照下面的顺序: 从内存获取 this.count 的值放到寄存器 将寄存器中的值增加value 将寄存器中的值写回内存 观察线程A和B交错执行会发生什么: this.count = 0; A: 读取 this.count 到一个寄存器 (0) B: 读取 this.count 到一个寄存器 (0) B: 将寄存器的值加2 B: 回写寄存器值(2)到内存. this.count 现在等于 2 A: 将寄存器的值加3 A: 回写寄存器值(3)到内存. this.count 现在等于 3 两个线程分别加了2和3到count变量上,两个线程执行结束后count变量的值应该等于5。然而由于两个线程是交叉执行的,两个线程从内存中读出的初始值都是0。然后各自加了2和3,并分别写回内存。最终的值并不是期望的5,而是最后写回内存的那个线程的值,上面例子中最后写回内存的是线程A,但实际中也可能是线程B。如果没有采用合适的同步机制,线程间的交叉执行情况就无法预料。 ### 竞态条件 & 临界区 ### 当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。导致竞态条件发生的代码区称作临界区。上例中add()方法就是一个临界区,它会产生竞态条件。在临界区中使用适当的同步就可以避免竞态条件。 转载:[http://ifeve.com/race-conditions-and-critical-sections/][http_ifeve.com_race-conditions-and-critical-sections] [http_ifeve.com_race-conditions-and-critical-sections]: http://ifeve.com/race-conditions-and-critical-sections/
相关 Java多线程:竞态条件与避免策略 在Java编程中,多线程可能会遇到一种称为"竞态条件"的问题。这种问题通常发生在多个线程同时访问和修改共享资源时。 竞态条件的常见类型包括: 1. 读写不一致:一个线程读到某 爱被打了一巴掌/ 2024年09月16日 16:57/ 0 赞/ 5 阅读
相关 Java多线程竞态条件与避免策略 在Java多线程编程中,竞态条件(Race Conditions)是一个常见的问题。它主要源于多个线程同时访问和修改共享资源。 竞态条件的典型表现包括: 1. 读取到错误的数 ﹏ヽ暗。殇╰゛Y/ 2024年09月13日 00:36/ 0 赞/ 16 阅读
相关 Java多线程竞态条件示例 在Java编程中,竞态条件(Race Condition)是一种常见的并发问题。当多个线程同时访问和修改共享数据时,就可能发生竞态条件。 下面是一个简单的Java多线程竞态条 ゞ 浴缸里的玫瑰/ 2024年09月06日 06:21/ 0 赞/ 18 阅读
相关 多线程(11)临界区 临界区,又称为临界段,是指在并发编程环境下,能够访问共享资源的那部分代码。这些共享资源可能包括共享内存、文件、数据库记录等。临界区的存在是并发程序设计中需要重点关注的问题... 阳光穿透心脏的1/2处/ 2024年04月24日 23:07/ 0 赞/ 32 阅读
相关 并发编程五:竞态条件与临界区 并发编程:竞态条件与临界区 介绍 当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。导致竟态条件发生的代码称作临界区。 浅浅的花香味﹌/ 2022年09月25日 05:26/ 0 赞/ 155 阅读
相关 多线程—临界区 多线程—临界区: 解决多个线程同时防访一个变量的解决方法。 include<stdio.h> include<stdlib.h> include<W 我会带着你远行/ 2022年09月24日 14:27/ 0 赞/ 120 阅读
相关 多线程 竞态条件与临界区 竞态条件与临界区 在同一程序中运行多个线程本身不会导致问题,问题在于多个线程访问了相同的资源。如,同一内存区(变量,数组,或对象)、系统(数据库,web services 傷城~/ 2022年06月06日 00:10/ 0 赞/ 178 阅读
相关 Java并发编程学习笔记(六)竞态条件与临界区 在同一程序中运行多个线程本身不会导致问题,问题在于多个线程访问了相同的资源。如,同一内存区(变量,数组,或对象)、系统(数据库,web services等)或文件。实际上,这些 一时失言乱红尘/ 2022年05月31日 14:08/ 0 赞/ 145 阅读
相关 竞态条件与临界区 在同一程序中运行多个线程本身不会导致问题,问题在于多个线程访问了相同的资源。 如,同一内存区(变量,数组,或对象)、系统(数据库,web services等)或文件。 约定不等于承诺〃/ 2022年05月27日 03:12/ 0 赞/ 155 阅读
还没有评论,来说两句吧...