前言

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

代码实现

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

1
2
3
4
5
6
7
8
public class Counter {  
protected long count = 0;
// 临界区
public void add(long value) {
// 被竞争的资源
this.count = this.count + value;
}
}

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

总结

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