请关注我的微信公众号

个人微信公众号
技术交流群 (仅作技术交流):642646237

请关注我的头条号:

使用不可变状态的原因——隐藏的可变状态
下面这个类没有使用可变状态,看上去肯定是线程安全的:

但是实际上并不是,原因是SimpleDateFormmat
内部有隐藏的可变状态。
Java这类语言为了让代码写起来简单,在此隐藏了可变状态,这也使用户无法判断何时会发生问题——从API无法判断SimpleDateFormat
是否是线程安全的。
使用不可变状态的原因——逃逸的可变状态

players
是私有变量,仅被addPlayer()
和getPlayerIterator()
使用,且两个方法都标记了synchronized
。
然而它并不是线程安全的,因为getPlayerIterator()
返回的迭代器仍引用了players
内部的可变状态——如果在迭代器被使用时,另一个线程调用了addPlayer()
方法,那么程序就会抛出ConcurrentModificationException
或者变得更糟。
并发编程可变状态导致的风险
在并发编程中,隐藏和逃逸仅仅是两种可变状态带来的风险——还有很多其他风险。
网友评论