我的编程空间,编程开发者的网络收藏夹
学习永远不晚

老生常谈java中的fail-fast机制

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

老生常谈java中的fail-fast机制

在JDK的Collection中我们时常会看到类似于这样的话:

例如,ArrayList:

注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器会尽最大努力抛出 ConcurrentModificationException。因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误的做法:迭代器的快速失败行为应该仅用于检测 bug。

HashMap中:

注意,迭代器的快速失败行为不能得到保证,一般来说,存在非同步的并发修改时,不可能作出任何坚决的保证。快速失败迭代器尽最大努力抛出 ConcurrentModificationException。因此,编写依赖于此异常的程序的做法是错误的,正确做法是:迭代器的快速失败行为应该仅用于检测程序错误。

在这两段话中反复地提到”快速失败”。那么何为”快速失败”机制呢?

“快速失败”也就是fail-fast,它是Java集合的一种错误检测机制。当多个线程对集合进行结构上的改变的操作时,有可能会产生fail-fast机制。记住是有可能,而不是一定。例如:假设存在两个线程(线程1、线程2),线程1通过Iterator在遍历集合A中的元素,在某个时候线程2修改了集合A的结构(是结构上面的修改,而不是简单的修改集合元素的内容),那么这个时候程序就会抛出 ConcurrentModificationException 异常,从而产生fail-fast机制。

一、fail-fast示例

public class FailFastTest {  private static List<Integer> list = new ArrayList<>();      private static class threadOne extends Thread{   public void run() {    Iterator<Integer> iterator = list.iterator();    while(iterator.hasNext()){     int i = iterator.next();     System.out.println("ThreadOne 遍历:" + i);     try {      Thread.sleep(10);     } catch (InterruptedException e) {      e.printStackTrace();     }    }   }  }      private static class threadTwo extends Thread{   public void run(){    int i = 0 ;    while(i < 6){     System.out.println("ThreadTwo run:" + i);     if(i == 3){      list.remove(i);     }     i++;    }   }  }    public static void main(String[] args) {   for(int i = 0 ; i < 10;i++){    list.add(i);   }   new threadOne().start();   new threadTwo().start();  } } 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

老生常谈java中的fail-fast机制

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

老生常谈java中的fail-fast机制

在JDK的Collection中我们时常会看到类似于这样的话:例如,ArrayList:注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器会尽最大努力抛出 Concurren
2023-05-31

老生常谈java中的Future模式

jdk1.7.0_79 本文实际上是对上文《简单谈谈ThreadPoolExecutor线程池之submit方法》的一个延续或者一个补充。在上文中提到的submit方法里出现了FutureTask,这不得不停止脚步将方向转向Java的Fut
2023-05-31

老生常谈android中的事件传递和处理机制

一直以来,都被android中的事件传递和处理机制深深的困扰!今天特意来好好的探讨一下。现在的感觉是,只要你理解到位,其实事件的 传递和处理机制并没有想象中的那么难。总之,不要自己打击自己,要相信自己能掌握这块知识。好了,下面是我今天的收获
2022-06-06

老生常谈java中的数组初始化

数组的初始化可以分为两种:1、静态初始化2、动态初始化静态初始化:例:String[] str = new String[]{"A","B","C"};String str[] = new String[]{"A","B","C"};Str
2023-05-31

Java的Iterator,fail-fast机制与比较器怎么使用

本篇内容主要讲解“Java的Iterator,fail-fast机制与比较器怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java的Iterator,fail-fast机制与比较器怎么使
2023-06-02

老生常谈.NET中的 COM 组件

COM组件中的接口是一组由组件实现的,提供给客户使用的函数,这篇文章主要介绍了.NET中的 COM 组件,需要的朋友可以参考下
2022-11-13

老生常谈Vue中的侦听器watch

开发中我们在data返回的对象中定义了数据,这个数据通过插值语法等方式绑定到template中,这篇文章主要介绍了Vue中的侦听器watch,需要的朋友可以参考下
2022-11-13

老生常谈java路径中的反斜杠和斜杠的区别

JAVA中的斜杠有正斜杠与反斜杠之分,正斜杠,一般就叫做斜杠,符号为“/”;反斜杠的符号为“\”。斜杠(/)在JAVA中没有什么特别的意义,就是代表一个字符‘/';反斜杠(\)则不然,它和紧跟着它的那个字符构成转义字符,如“\n”(换行)、
2023-05-31

请谈谈Java中的异常处理机制。(在Java编程中,应如何合理处理异常?)

Java中的异常处理机制允许程序员处理错误情况,防止程序崩溃并提高鲁棒性。异常处理流程包括抛出、捕获和处理异常。异常类层次结构将异常分为检查异常和非检查异常。最佳异常处理实践包括使用特定异常、提供有意义的错误消息、仅捕获必要异常和区分正常流程与异常情况等。
请谈谈Java中的异常处理机制。(在Java编程中,应如何合理处理异常?)
2024-04-02

Java中Exception异常机制的原理

本篇文章给大家分享的是有关Java中Exception异常机制的原理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Error与Exception的区别与相同点:Error是严重
2023-06-15

Java中的异常处理机制介绍(非常全面!)

异常可能是在程序执行过程中产生的,也可能是程序中throw主动抛出的,下面这篇文章主要给大家介绍了关于Java中异常处理机制的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2023-01-18

JAVA中实现原生的 socket 通信机制原理

本文介绍了JAVA中实现原生的 socket 通信机制原理,分享给大家,具体如下:当前环境jdk == 1.8知识点 socket 的连接处理 IO 输入、输出流的处理 请求数据格式处理 请求模型优化场景今天,和大家聊一下 JAVA
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录