Kotlin刨根问底(二):for循环引起的一起“血案”(下)

简介: 本文灵感来源于:群友遍历列表时remove元素引发异常,后对for循环的实现原理进行一系列的探究~

0x4、fail-fast(快速失败)


从上面我们知道了异常发生的原因了,那为何要这样设计呢?这种玩法有个专业名词 →「fail-fast(快速失败)机制


在做系统设计的时候先考虑异常情况,一旦发生异常,直接停止并上报。


举个简单的例子,写个两数相除的方法,如果不小心除以0,运行时就会引发异常ArithmeticException by/zero,而及时失败,则是在执行运算前检测被除数是否为0,是直接抛出异常。示例如下:



行吧,一种检测Bug机制,用于提前预警,那ArrayList里为何要用到这种机制呢?


→ 因为ArrayList不是线程安全的,多个线程同时访问同一个ArrayList可能会引起异常;


→ 引入及时失败是想着:若某个线程通过Iterator遍历时,集合内容被其他线程改变,抛出异常;


在上面的例子中,我们利用迭代器遍历remove的方式来规避ConcurrentModificationException,但那是只有在单个线程访问列表,如果是有多个线程在访问呢?写个例子试试:




行吧,抛异常了,那有在多线程的时候有什么办法规避呢?换个线程安全的容器,比如:Vector


一样会抛异常,Vector虽然采用synchronized进行同步,但还是继承自AbstarctList,直接通过Iterator即可访问容器元素,根本不需要获取锁。


哪有解决方法吗?


有,直接在使用iterator处加锁即可,代码示例如下:




可以,那除了对iterator加锁的方式外,还有其他方法吗?


有,上并发容器,它采用的是fail-safe(安全失败)机制:迭代时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历,遍历期间原集合发生的修改迭代器是不知道的,以此避免了ConcurrentModificationException,但同样的迭代器不能访问到修改后的内容。Java中的并发容器放在java.util.concurrent包中,比如可以使用CopyOnWriteArrayList来代替ArrayList和Vector。


0x5、Kotlin中toList()的原理


差点漏了,那位盘友问的为啥加个toList()就可以了,代码示例如下:



跟下源码:



传入的集合类型,大小为5,走else,进toMutableList



啧啧,看到这里,你get到原理没?


  • 直接创建了一个新的ArrayList,把原列表作为参数传入初始化;


  • 拿新列表的迭代器遍历,移除的是旧列表中的元素,肯定互不影响啊,和fail-safe(安全失败)的玩法如出一辙。


相关文章
|
12月前
|
分布式计算 Java 数据安全/隐私保护
Kotlin 学习笔记(二)—— 数据类、枚举类、循环、常用集合及操作符的写法(下 )
Kotlin 学习笔记(二)—— 数据类、枚举类、循环、常用集合及操作符的写法(下)
61 0
|
4月前
|
Kotlin 索引
Kotlin中循环语句
Kotlin中循环语句
|
2月前
|
Java Android开发 开发者
Kotlin 循环与函数详解:高效编程指南
高效编程实践 • 避免不必要的循环 - 尽量使用集合操作如 map、filter 来减少显式的循环。 • 使用尾递归优化 - 对于需要大量递归的情况,考虑使用尾递归以优化性能。 • 内联函数 - 对于传递 Lambda 表达式的函数,使用 inline 关键字可以减少运行时开销。 通过上述指南,您应该能够更好地理解 Kotlin 中的循环和函数,并能够编写更加高效和简洁的代码。Kotlin 的设计哲学鼓励开发者编写易于理解和维护的代码,而掌握循环和函数是实现这一目标的关键步骤。 如果您想了解更多关于 Kotlin 的循环和函数的信息,以下是一些官方文档和资源,它们可以提供额外的参考
35 1
|
2月前
|
Java Kotlin
Kotlin 循环与函数详解:高效编程指南
Kotlin中的循环结构让你能轻松遍历数组或范围内的元素。使用`for`循环结合`in`操作符,可以简洁地访问数组中的每个项,如字符串数组或整数数组。对于范围,可以用`..`来定义一系列连续的值并进行迭代。此外,Kotlin支持通过`break`和`continue`控制循环流程。函数则允许封装可复用的代码块,你可以定义接受参数并返回值的函数,利用简写语法使代码更加紧凑。例如,`myFunction(x: Int, y: Int) = x + y`简洁地定义了一个计算两数之和的函数。
42 1
|
2月前
|
安全 Java Android开发
Android Kotlin中如何优雅地退出循环?
本文介绍Kotlin中如何在`forEach`循环中提前退出的方法,包括使用`for`循环搭配`break`以及利用标签和`return@标签`的方式。此外,还探讨了标签与`return`、`break`和`continue`在不同场景下的应用,如嵌套循环控制、高阶函数中的提前退出及`inline`函数内的非局部返回等,帮助读者更好地掌握Kotlin的控制流技巧。
45 0
|
4月前
|
Kotlin
Kotlin流程控制、循环
Kotlin流程控制、循环
|
12月前
|
Java Kotlin
Kotlin 学习笔记(二)—— 数据类、枚举类、循环、常用集合及操作符的写法(上)
Kotlin 学习笔记(二)—— 数据类、枚举类、循环、常用集合及操作符的写法(上)
51 0
|
设计模式 缓存 Java
Kotlin刨根问底(二):for循环引起的一起“血案”(中)
本文灵感来源于:群友遍历列表时remove元素引发异常,后对for循环的实现原理进行一系列的探究~
328 0
|
安全 Java 测试技术
Kotlin刨根问底(二):for循环引起的一起“血案”(上)
本文灵感来源于:群友遍历列表时remove元素引发异常,后对for循环的实现原理进行一系列的探究~
477 0
|
Java Android开发 图形学
Android修行手册之Kotlin-【条件语句】、【循环控制】篇
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
316 0