|
|
1
9
简单的第一步。是的,读写布尔变量是一个原子操作( :我的意思是读写操作 他们自己 是布尔函数的原子运算,而不是读取 和 写入时,当然会生成两个操作,这两个操作一起不会是原子的) 但是,除非您采取额外的步骤,否则编译器可能会优化这些读写操作,或者移动操作,这可能会使您的代码的操作与您所期望的不同。
将字段标记为
但是,在多核和多CPU计算机上,不同的核和CPU在其缓存中的字段值可能不同,因此您可以添加
因此,如果您怀疑或知道这个字段将被写入多个线程并从多个线程读取,我肯定会将锁定和volatile添加到混合中。
请注意,我不是多线程方面的专家,我可以自己处理,但我通常会防御性地编程。有可能(我认为很可能)您可以实现一些不使用锁的东西(有许多无锁结构),但遗憾的是,我在这个主题中没有足够的经验来处理这些事情。因此,我的建议是在
|
|
|
2
2
单靠volatile是不够的,它有不同的用途,lock应该是好的,但最终要看是否有人要在我的类中设置boolVal,谁知道呢,你可能有一个worker线程在里面旋转。这也取决于你如何在内部使用boolVal。你可能还需要其他地方的保护。如果你问我,如果你不确定你会在多个线程中使用MyClass,那么你甚至不值得去考虑它。 |