Java如何在临界区中避免竞态条件
作者:cuisuqiang 时间:2022-11-02 09:39:29
当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。导致竞态条件发生的代码区称作临界区。在临界区中使用适当的同步就可以避免竞态条件。
界区实现方法有两种,一种是用synchronized,一种是用Lock显式锁实现。synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法(或者该类的其他同步方法),有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,锁定调用者,然后直接运行。它包括两种用法:synchronized 方法和 synchronized 块。
Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问object的一个加锁代码块时,另一个线程仍可以访问该object中的非加锁代码块。
有临界区是为了让更多的其它线程能安全够访问资源。
class Counter {
protected long count = 0;
public void add(long value) {
this.count = this.count + value;
}
}
观察线程A和B交错执行会发生什么,两个线程分别加了2和3到count变量上,两个线程执行结束后count变量的值应该等于5。然而由于两个线程是交叉执行的,两个线程从内存中读出的初始值都是0。然后各自加了2和3,并分别写回内存。最终的值并不是期望的5,而是最后写回内存的那个线程的值,上面例子中最后写回内存的是线程A,但实际中也可能是线程B。如果没有采用合适的同步机制,线程间的交叉执行情况就无法预料。
add()方法就是一个临界区,它会产生竞态条件。
来源:https://www.iteye.com/blog/cuisuqiang-2020152
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
IDEA 2020 本土化,真的是全中文了(真香)
![](https://img.aspxhome.com/file/2023/6/60196_0s.png)
JAVA 字符串加密、密码加密实现方法
android自动生成dimens适配文件的图文教程详解(无需Java工具类)
![](https://img.aspxhome.com/file/2023/1/69721_0s.png)
详解Swagger接口文档和常用注解的使用
![](https://img.aspxhome.com/file/2023/7/59847_0s.png)
Android植物大战僵尸小游戏
![](https://img.aspxhome.com/file/2023/7/86017_0s.png)
java求100之内的素数(质数)简单示例
java实现学生信息管理系统
Java线程编程中isAlive()和join()的使用详解
java调用回调机制详解
![](https://img.aspxhome.com/file/2023/2/59152_0s.jpg)
基于C语言实现静态通讯录的示例代码
![](https://img.aspxhome.com/file/2023/2/103102_0s.gif)
C语言字符串另类用法的实现
详解Java线程-守护线程与用户线程
深入理解Java设计模式之抽象工厂模式
![](https://img.aspxhome.com/file/2023/6/60336_0s.jpg)
c#实现16进制和字符串之间转换的代码
Java如何实现树的同构?
![](https://img.aspxhome.com/file/2023/4/59084_0s.png)
详解Spring 中 Bean 对象的存储和取出
![](https://img.aspxhome.com/file/2023/2/57832_0s.png)
基于sharding-jdbc的使用限制
Spring Boot详解创建和运行基础流程
![](https://img.aspxhome.com/file/2023/5/61555_0s.png)
Java使用新浪微博API通过账号密码方式登陆微博的实例
Java基础之final关键字作用案例
![](https://img.aspxhome.com/file/2023/6/62126_0s.png)