我是靠谱客的博主 老迟到萝莉,这篇文章主要介绍java并发线程安全,延迟初始化中的竞态条件。代码,现在分享给大家,希望可以做个参考。

现有线程A,B,对以下代码并发访问,获取实例。

先来看一段代码:

代码

这里写图片描述

在以上代码中,理想是结果是线程A,B得到得到同一个实例对象,但是结果却并不绝对,有可能会得到2个不同的实例对象。

在《java并发编程实战》书中描述为:在LazyInitRace 中包含了一个竞态条件,它可能会破坏这个类的正确性。假定线程A和线程B 同时执行getInstance 方法。A 看到instance 为空,因此A创建一个新的ExpensiveObject实例。B 同样需要判断instance 是否为空。此时的instance是否为空,要取决于不可预测的时序,包括线程的调度方式,以及A 需要花多长时间来初始化ExpensiveObject并设置instance。如果当B检查时,instance为空,那么在两次调用getInstance 时可能会得到不同的结果。

在书中已经很清晰的描述可能出现的情况,如果不是很理解,可以看下面这张图:这里写图片描述
上图片只是运行的一种可能性,由于线程的执行,时序具有不确定性,那么得到的结果就会发生不可预测的结果,而发生在同一个对象返回不同的实例对象。

若要阻止出现这种情况,需要使用Synchrogazed 关键字,对对象的加锁,这就意味着最多只有一个线程能持有这种锁,不会发生竞争的这种现象。

代码

加上锁

本文中的例子摘自《java并发编程实战》,加上自己对这些文字的理解,如若写错,欢迎指教。

最后

以上就是老迟到萝莉最近收集整理的关于java并发线程安全,延迟初始化中的竞态条件。代码的全部内容,更多相关java并发线程安全,延迟初始化中内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(80)

评论列表共有 0 条评论

立即
投稿
返回
顶部