栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如果只有一个线程写入而多个线程读取,是否需要添加一些锁或同步?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如果只有一个线程写入而多个线程读取,是否需要添加一些锁或同步?

您需要在这里进行同步(有一个警告,我将在后面讨论)。

主要问题是读取器线程可能永远看不到写入器线程进行的任何更新。通常,任何给定的写入最终都会被看到。但是在这里,您的更新循环非常简单,以至于写入可以轻松地保存在缓存中,而永远不会写入主内存。因此,您实际上必须在这里同步。

编辑11/2017
我将更新此内容,并说一个值可能在缓存中保留这么长时间可能是不现实的。我认为,这样的变量访问可以由编译器优化并保存在寄存器中,这是一个问题。因此,仍然需要同步(或

volatile
)来告知优化器确保为每个循环实际获取一个新值。

因此,您要么需要使用

volatile
,要么需要使用(静态)getter和setter方法,并且
synchronized
在这两种方法上都需要使用关键字。对于偶尔这样的写法,
volatile
关键字的权
重要得多

需要注意的是,如果您真的不需要查看来自写入线程的及时更新,则不必进行同步。如果无限期的延迟不会影响您的程序功能,则可以跳过同步。但是在计时器上这样的事情看起来并不适合用来省略同步。

编辑:Per Brian Goetz在 Java Java Concurrency in Practice中 ,不允许Java / a
JVM向您显示“不确定”值-从未写入的值。从技术上讲,这些值称为“凭空传播”的值,并且Java规范不允许使用它们。您可以确保看到先前对全局变量进行的写操作,它是初始化时使用的零,也可以是后续的写操作,但不允许其他值。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/574504.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号