并发编程五:竞态条件与临界区 浅浅的花香味﹌ 2022-09-25 05:26 155阅读 0赞 # 并发编程:竞态条件与临界区 # ## 介绍 ## 当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。导致竟态条件发生的代码称作临界区。 备注:以下这段代码就存在竞态条件,其中return ++count就是临界区。 -------------------- public class Obj { private int count; public int incr() { return ++count; } } -------------------- 同一程序中运行在多个线程本身不会导致任何问题,问题在于当多个线程访问了相同资源时候。 如:访问同一内存区(变量、数组、对象)、数据库或文件。那么就可能会出现问题了。 ## 竞态条件分析 ## **演示代码** public class Counter { private int count = 0; public int incr() { return (++count); //上面一句代码替换为下面的代码可能更好理解 int sum=count+1 return sum //首先++count并非是一个原子操作,其实先读取count值然后再自增操作的。 } } -------------------- 假如现在有A,B两个线程执行incr方法 T1时刻:A读取count值为0在执行自增操作之前,cpu又调度到B执行了 T2时刻:B读取count值为0执行自增操作count变为1,cpu又调度到A线程执行 T3时刻:A继续执行自增操作,count值变为1.此时就存在问题了,A线程没有重新读取count的值,导致结果不对 -------------------- JVM按照下面的顺序执行incr()方法 1、从内存获取this.count的值放到寄存器 2、将寄存器中的值加1 3、将寄存器的值写回到内存 如果A、B线程交错执行的情景可能就如下 A:读取this.count到一个寄存器X1(0) B:读取this.count到一个寄存器X2(0) B:将寄存器X2的值加1 B:回写寄存器X2(1)到内存,this.count现在就是1 A:将寄存器X1的值加1 A:回写寄存器值X1(1)到内存,this.count闲杂就是1 备注:这样就存在问题了,B线程已经自增过一次了,但是A线程并没有发现,导致它任然以为this.count为0的基础上自增。 因此如果没有采用合适的同步机制,线程间的交叉执行的情况就无法预料的。 备注:之所以存在这种问题,其实本质上市因为操作系统架构问题,任何操作都会经过内存再到寄存器, 正因为有内存这一环节导致有些时候数据并不及时被刷新,但是有内存的架构师必须的也是很有必要的。如果直接将数据放在寄存器操作的话那简直难以想象。 ## 总结 ## 多线程开发是最重要的事情是先分析清楚共享资源和共享对象,明白什么地方会存在安全隐患,这样才能更好的避免引起安全问题。 ## 参考 ## 1、[http://tutorials.jenkov.com/java-concurrency/thread-safety.html][http_tutorials.jenkov.com_java-concurrency_thread-safety.html] [http_tutorials.jenkov.com_java-concurrency_thread-safety.html]: http://tutorials.jenkov.com/java-concurrency/thread-safety.html
相关 Java并发编程挑战:线程安全与竞态条件示例 在Java并发编程中,线程安全和竞态条件是两个关键概念。 1. **线程安全**:当一个方法对多个线程同时访问并正确管理共享资源时,这个方法就是线程安全的。否则,可能会导致数 痛定思痛。/ 2024年09月15日 16:21/ 0 赞/ 15 阅读
相关 并发编程:线程同步与竞态条件实例 并发编程是多任务同时执行的编程方式。其中,线程同步和竞态条件是常见的问题。 1. 线程同步: - **互斥锁**(Mutex):一个线程在持有锁后可以访问临界区,其他线 àì夳堔傛蜴生んèń/ 2024年09月12日 15:03/ 0 赞/ 16 阅读
相关 当面对Java并发编程中竞态条件问题 在Java并发编程中,竞态条件(Race Condition)是指两个或多个线程在同一时刻访问和修改共享资源,导致结果不可预期的问题。 例如: 1. 多个线程同时读取一个co 朴灿烈づ我的快乐病毒、/ 2024年09月11日 10:39/ 0 赞/ 17 阅读
相关 Java并发编程中的竞态条件实例 在Java并发编程中,竞态条件是指两个或多个线程对共享资源的访问没有按照预期的顺序执行,导致结果不可预测。 下面是一个简单的竞态条件实例: ```java // 定义一个共 妖狐艹你老母/ 2024年09月10日 23:30/ 0 赞/ 21 阅读
相关 并发编程五:竞态条件与临界区 并发编程:竞态条件与临界区 介绍 当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。导致竟态条件发生的代码称作临界区。 浅浅的花香味﹌/ 2022年09月25日 05:26/ 0 赞/ 156 阅读
相关 多线程 竞态条件与临界区 竞态条件与临界区 在同一程序中运行多个线程本身不会导致问题,问题在于多个线程访问了相同的资源。如,同一内存区(变量,数组,或对象)、系统(数据库,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 阅读
还没有评论,来说两句吧...