0 Bug案例
demo 类
起俩线程分别执行add、compare
乍看,a、b“同时”自增,应一直相等,compare中判断不会为true。但看日志:不仅有ab有时也true。
评论区就笑了,这是你代码太垃圾,操作两个字段a和b,有线程安全问题,应该为add方法加锁,确保a和b的++原子性。
那就在add方法加锁
public synchronized void add()
但加锁后问题并没解决。
1 为何锁能解决线程安全问题?因为只有一个线程能拿到锁,所以加锁后的代码中的资源操作线程安全。
但该案例中的 add 始终只有一个线程在操作呀,显然只为 add 加锁毫无意义。所以因为两个线程是交错执行add、compare中的业务逻辑,而且这些业务逻辑不是原子性:a++和b++操作中可穿插在compare方法的比较代码。a
关注
打赏