首页 > 其他 > 详细

关于活性失败、快速失败、安全失败

时间:2019-09-04 01:20:57      阅读:155      评论:0      收藏:0      [点我收藏+]

1、活性失败


多线性并发时,如果A线程修改了共享变量,此时B线程感知不到此共享变量的变化,叫做活性失败。

如何解决活性失败,那就需要两个线程之间对此变量有happens-before关系,最常见的就是volatile 或 加锁。

 

2、快速失败(fail-fast)


对集合进行迭代时 如果有其他线程对集合进行添加 删除操作,迭代会快速报错。

抛出ConcurrentModificationException异常 ,叫做快速失败。

例:(HashMap同理)

技术分享图片
import java.util.ArrayList;
import java.util.List;

class YfModel{
    private String name;

    public YfModel(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
public class ExceptionYf {
    public static void main(String[] args){
        YfModel yfModel = new YfModel("default1");
        YfModel yfMode2 = new YfModel("default2");
        YfModel yfMode3 = new YfModel("default3");
        YfModel yfMode4 = new YfModel("default4");
        YfModel yfMode5 = new YfModel("default5");
        List<YfModel> yfModelList = new ArrayList<>();
        yfModelList.add(yfModel);
        yfModelList.add(yfMode2);
        yfModelList.add(yfMode3);
        yfModelList.add(yfMode4);

        for(YfModel tempYfModel : yfModelList){
            System.out.println("valueModel="+ tempYfModel.getName());
            yfModelList.add(yfMode5);
        }

    }
}
View Code

报错:

Exception in thread "main" java.util.ConcurrentModificationException
 at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
 at java.util.ArrayList$Itr.next(ArrayList.java:859)
 at com.yangfei.test.exceptiontest.ExceptionYf.main(ExceptionYf.java:36)

 

注意:

快速失败只是检测集合的元素个数是否有变化,如果元素是一个对象,修改这个对象的话。并不会报错。

 

 

3、安全失败(fail-safe)


对集合迭代时 对原集合进行一份拷贝,对拷贝的新元素进行迭代,这叫安全失败

这样原集合的修改 在迭代的过程中就不会感知。java并发集合框架下(java.util.concurrent)迭代都是安全失败的

例:

技术分享图片
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

class YfModel{
    private String name;

    public YfModel(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
public class ExceptionYf {
    public static void main(String[] args){
        YfModel yfModel = new YfModel("default1");
        YfModel yfMode2 = new YfModel("default2");
        YfModel yfMode3 = new YfModel("default3");
        YfModel yfMode4 = new YfModel("default4");
        YfModel yfMode5 = new YfModel("default5");
        List<YfModel> yfModelList = new ArrayList<>();
        yfModelList.add(yfModel);
        yfModelList.add(yfMode2);
        yfModelList.add(yfMode3);
        yfModelList.add(yfMode4);

        Map<String,YfModel> yfMap = new ConcurrentHashMap<>();
        yfMap.put("default1",yfModel);
        yfMap.put("default2",yfMode2);
        yfMap.put("default3",yfMode3);
        yfMap.put("default4",yfMode4);

        for(Map.Entry<String, YfModel>  entry : yfMap.entrySet()){
            System.out.println("valueModel="+ entry.getValue().getName());
            yfMap.put("default5",yfMode5);
        }
    }
}
View Code

输出:

valueModel=default3
valueModel=default4
valueModel=default1
valueModel=default2

 

迭代过程中新增的元素 并不会输出。即使对对象元素的属性修改,也是感知不到的。

关于活性失败、快速失败、安全失败

原文:https://www.cnblogs.com/yangfei629/p/11456534.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!