3 个回答
只能保证一个共享变量的原子性操作:CAS 一次只能保证一个共享变量的原子性操作,如果要对多个共享变量保证原子性操作,使用 CAS 就无法达到目的。
解决这个问题,可以使用 synchronized 或者 Lock 锁来解决,或者将多个共享变量合并为一个。
解决这个问题,可以使用 synchronized 或者 Lock 锁来解决,或者将多个共享变量合并为一个。
发布于:2个月前 (02-08) IP属地:四川省
长时间自旋浪费资源:如果我们选择内存值和当前值不相等时自旋等待,那么当我们在修改一个共享变量时,如果一直内存值和当前值不相等,就会导致线程一直自旋等待。
解决这个问题,可以设定自旋次数,当自旋一定次数后,置为失败。
解决这个问题,可以设定自旋次数,当自旋一定次数后,置为失败。
发布于:2个月前 (02-08) IP属地:四川省
ABA 问题:CAS 在修改时只会判断当前值是否和内存值相同,但内存值可能被修改过又修改回来。
例如:线程 A 需要删除链表中的某个元素,读取后,另一个线程将该元素删除后另外一个线程在相同位置插入了相同的元素,线程 A 执行删除时发现元素没有变化,直接删除。但是实际的逻辑应该为该元素已经被删除,线程 A 删除失败,中间插入的元素应该保留。
解决这个问题,可以添加一个版本号,每次修改时,可以修改版本号,我们修改时需要比较之前读取的版本号和最新版本号是否一致,一致才可以修改。
例如:线程 A 需要删除链表中的某个元素,读取后,另一个线程将该元素删除后另外一个线程在相同位置插入了相同的元素,线程 A 执行删除时发现元素没有变化,直接删除。但是实际的逻辑应该为该元素已经被删除,线程 A 删除失败,中间插入的元素应该保留。
解决这个问题,可以添加一个版本号,每次修改时,可以修改版本号,我们修改时需要比较之前读取的版本号和最新版本号是否一致,一致才可以修改。
发布于:2个月前 (02-08) IP属地:四川省
我来回答
您需要 登录 后回答此问题!