2 回答
TA贡献1835条经验 获得超7个赞
仅当您的计算机包含多个 CPU 时才应使用易失性变量吗?
除非您正在为嵌入式系统编写代码,否则针对特定硬件平台优化您的代码可能是在浪费您的时间。从长远来看,这甚至可能是一个代价高昂的错误。
如果您正在编写 Java 代码,那么您很可能正在编写服务、Web 应用程序、移动应用程序或桌面应用程序。如果您正在编写任何这些内容,那么您的目标应该是通用 Java 平台,或者 Java 平台和某些特定的 SDK 或框架。帮自己一个忙,不要担心任何电脑或手机的品牌和型号。
如果一个字段被声明为 volatile,... Java ... 确保所有线程看到变量的一致值
每当你使用“一致”这个词时,你应该问自己,“与什么一致? ”
如果将单个变量标记为volatile
,那么所有线程都会看到该变量的值与自身一致。也就是说,如果您有一个double d=0.0;
,并且线程 A 设置了d=1.0;
,并且线程 Bsystem.out.println(d);
大约在同一时间调用,则线程 B 保证打印0.0
或1.0
。它永远不会打印任何其他值。
也许更重要的是,如果一个 volatile 变量被更新多次,那么所有线程将就更新发生的一致顺序达成一致。
但是,如果您希望多个变量彼此一致,那么您应该使用synchronized
块或java.util.concurrent.locks.ReentrantLock
对象来保护该组变量,而忘记了volatile.
每个线程都可以将变量从主内存复制到 CPU 缓存中...
Java 中没有“缓存”。Java 有它的内存模型。CPU 缓存是内存模型背后的隐藏原因。如果您正在为某个特定的计算机平台实现 JVM,那么希望 Java 内存模型能够让您自由地利用平台的缓存系统为您带来好处。
如果您正在为 Java 平台编写代码,那么您应该首先担心 Java 内存模型,以及您的程序在面对它时是否会正确运行。学习高速缓存系统是一项课外活动,它可以帮助您更好地理解 Java 为何如此。
TA贡献1847条经验 获得超11个赞
可变变量保证发生在关系之前。如果只有一个线程正在写入而所有其他线程正在读取一个变量,那么在这种情况下 volatile 变量可确保线程安全。在其他情况下,您必须根据需要使用其他同步机制。
仅当您的计算机包含多个 CPU 时才应使用易失性变量吗?但是,如果我在同一个 obj 和一个 cpu 上有多个线程,它将如何表现?
操作系统调度程序为每个线程分配 CPU。每个内核可以处理一个或多个线程取决于硬件能力。可变变量是语言内部的抽象,它与硬件功能没有任何直接关系。
添加回答
举报