看完TheJSR-133CookbookforCompilerWriters关于volatile的实现,尤其是“与原子指令的交互”部分,我假设读取volatile变量而不更新它需要LoadLoad或LoadStore屏障。在页面的下方,我看到LoadLoad和LoadStore在X86CPU上实际上是无操作的。这是否意味着volatile读取操作可以在x86上没有显式缓存失效的情况下完成,并且与普通变量读取一样快(忽略volatile的重新排序约束)?我相信我没有正确理解这一点。有人可以开导我吗?编辑:我想知道多处理器环境是否存在差异。正如JohnV.所说,在单CPU系统上,CPU可能
看完TheJSR-133CookbookforCompilerWriters关于volatile的实现,尤其是“与原子指令的交互”部分,我假设读取volatile变量而不更新它需要LoadLoad或LoadStore屏障。在页面的下方,我看到LoadLoad和LoadStore在X86CPU上实际上是无操作的。这是否意味着volatile读取操作可以在x86上没有显式缓存失效的情况下完成,并且与普通变量读取一样快(忽略volatile的重新排序约束)?我相信我没有正确理解这一点。有人可以开导我吗?编辑:我想知道多处理器环境是否存在差异。正如JohnV.所说,在单CPU系统上,CPU可能
谁能解释一下transient和volatile修饰符在Java中的含义? 最佳答案 volatile和transient修饰符可以应用于类1的字段,而与字段类型无关。除此之外,它们是无关的。transient修饰符告诉Java对象序列化子系统在序列化类的实例时排除该字段。当对象被反序列化时,该字段将被初始化为默认值;即null用于引用类型,零或false用于原始类型。请注意,JLS(参见8.3.1.3)没有说明transient的含义,而是遵循JavaObjectSerializationSpecification.其他序列化机制
谁能解释一下transient和volatile修饰符在Java中的含义? 最佳答案 volatile和transient修饰符可以应用于类1的字段,而与字段类型无关。除此之外,它们是无关的。transient修饰符告诉Java对象序列化子系统在序列化类的实例时排除该字段。当对象被反序列化时,该字段将被初始化为默认值;即null用于引用类型,零或false用于原始类型。请注意,JLS(参见8.3.1.3)没有说明transient的含义,而是遵循JavaObjectSerializationSpecification.其他序列化机制
AtomicBoolean做了哪些volatileboolean无法实现的功能? 最佳答案 当所述字段仅由其所有者线程更新并且该值仅由其他线程读取时,我使用volatile字段,您可以将其视为发布/订阅场景,其中有许多观察者但只有一个发布者。但是,如果这些观察者必须根据字段的值执行一些逻辑,然后推回一个新值,那么我会使用Atomic*vars或锁或同步块(synchronizedblock),只要最适合我。在许多并发场景中,它归结为获取值,将其与另一个值进行比较并在必要时进行更新,因此Atomic*类中存在compareAndSet
AtomicBoolean做了哪些volatileboolean无法实现的功能? 最佳答案 当所述字段仅由其所有者线程更新并且该值仅由其他线程读取时,我使用volatile字段,您可以将其视为发布/订阅场景,其中有许多观察者但只有一个发布者。但是,如果这些观察者必须根据字段的值执行一些逻辑,然后推回一个新值,那么我会使用Atomic*vars或锁或同步块(synchronizedblock),只要最适合我。在许多并发场景中,它归结为获取值,将其与另一个值进行比较并在必要时进行更新,因此Atomic*类中存在compareAndSet
我需要一个函数(如WinAPI中的SecureZeroMemory)始终将内存归零并且不会被优化掉,即使编译器认为此后再也不会访问内存。似乎是volatile的完美候选者。但我实际上在让这个与GCC一起工作时遇到了一些问题。这是一个示例函数:voidvolatileZeroMemory(volatilevoid*ptr,unsignedlonglongsize){volatileunsignedchar*bytePtr=(volatileunsignedchar*)ptr;while(size--){*bytePtr++=0;}}足够简单。但是如果你调用它,GCC实际生成的代码会随着编
我需要一个函数(如WinAPI中的SecureZeroMemory)始终将内存归零并且不会被优化掉,即使编译器认为此后再也不会访问内存。似乎是volatile的完美候选者。但我实际上在让这个与GCC一起工作时遇到了一些问题。这是一个示例函数:voidvolatileZeroMemory(volatilevoid*ptr,unsignedlonglongsize){volatileunsignedchar*bytePtr=(volatileunsignedchar*)ptr;while(size--){*bytePtr++=0;}}足够简单。但是如果你调用它,GCC实际生成的代码会随着编
如果有两个线程访问一个全局变量,那么许多教程都说使变量volatile以防止编译器将变量缓存在寄存器中,从而无法正确更新。然而,两个线程都访问一个共享变量是需要通过互斥锁进行保护的东西,不是吗?但是在这种情况下,在线程锁定和释放互斥锁之间,代码处于一个关键部分,只有一个线程可以访问变量,在这种情况下,变量不需要是易失的?那么,多线程程序中volatile的用途/目的是什么? 最佳答案 简短而快速的回答:volatile(几乎)对于与平台无关的多线程应用程序编程毫无用处。它不提供任何同步,不创建内存栅栏,也不确保操作的执行顺序。它不会
如果有两个线程访问一个全局变量,那么许多教程都说使变量volatile以防止编译器将变量缓存在寄存器中,从而无法正确更新。然而,两个线程都访问一个共享变量是需要通过互斥锁进行保护的东西,不是吗?但是在这种情况下,在线程锁定和释放互斥锁之间,代码处于一个关键部分,只有一个线程可以访问变量,在这种情况下,变量不需要是易失的?那么,多线程程序中volatile的用途/目的是什么? 最佳答案 简短而快速的回答:volatile(几乎)对于与平台无关的多线程应用程序编程毫无用处。它不提供任何同步,不创建内存栅栏,也不确保操作的执行顺序。它不会