竞态条件 racing condition

2023-10-20 11:36:51 浏览数 (1)

前言

多个线程读时,线程是安全的。 当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。 我的理解,竞态条件就是一种情况。

代码实现

假设有 A、B 两个线程,调用 add 方法分别传入 1 和 2,理想条件下结果应该是 3。 现在出现了不安全的情况,有可能结果不对。 add方法就是临界区 count 就是同一资源

代码语言:javascript复制
public class Counter {  
    protected long count = 0;  
    // 临界区
    public void add(long value) {  
        // 被竞争的资源
        this.count = this.count   value;  
    }  
}  

其实这样一看,说白了,就是要严格控制线程的执行顺序,假设是按A、B的顺序执行来讲,B依赖于A先执行完成,B再执行结果才是正确的,中间不能出现问题,否则如果,中间交叉执行,就有可能发生了竞态条件。

总结

如果某个资源会被多个线程竞争,要保证安全性的情况下,可以加上一些必要的同步措施如加锁,来保证线程安全。 是不是被竞争的资源,如果是web服务,有tomcat这种请求一直到查数据库都没有创建新的线程,那么每个线程都是隔离的,但是如果中间存在访问某个静态的成员变量或同一条数据,就有可能存在竞争,需要评估是否存在安全问题。

0 人点赞