Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中原子变量对锁的惩罚_Java_Multithreading_Locking_Atomic - Fatal编程技术网

Java中原子变量对锁的惩罚

Java中原子变量对锁的惩罚,java,multithreading,locking,atomic,Java,Multithreading,Locking,Atomic,在我当前的项目中,当有多个线程访问原子整数和原子布尔值时,我会尽可能使用原子整数和原子布尔值。这有助于保持逻辑锁自由(在内部我知道它可能仍然使用锁),代码更干净。用例主要用于可能突然更改的配置标记 我想知道使用原子变量对性能的影响是什么,这会不会太频繁地使缓存失效,并且实际上使我的解决方案不如只使用锁?原子*类不使用锁,它使用CAS(比较和设置)来实现线程安全。一般来说,它们比锁定变体更快,但是在非常高的争用下,它们实际上更慢。 如果您想进行一些类比,它类似于DB中的乐观和悲观锁定 若你们对更多

在我当前的项目中,当有多个线程访问原子整数和原子布尔值时,我会尽可能使用原子整数和原子布尔值。这有助于保持逻辑锁自由(在内部我知道它可能仍然使用锁),代码更干净。用例主要用于可能突然更改的配置标记


我想知道使用原子变量对性能的影响是什么,这会不会太频繁地使缓存失效,并且实际上使我的解决方案不如只使用锁?

原子*类不使用锁,它使用CAS(比较和设置)来实现线程安全。一般来说,它们比锁定变体更快,但是在非常高的争用下,它们实际上更慢。 如果您想进行一些类比,它类似于DB中的乐观和悲观锁定

若你们对更多的细节感兴趣,你们可能想看看这本书

添加:使用缓存,我假设您指的是关系发生之前发生的事情。以下是引自:

java.util.concurrent.atomic包定义了支持 单变量的原子操作。所有的课程都有get和set 对易失性变量执行读写操作的方法。那个 就是说,集合与任何后续的get on都有一个before-before关系 相同的变量


你知道它是否会像易失性变量访问那样使线程缓存失效吗?@sodik原子类永远不会使用锁这不是真的。如果机器中不支持原子,JVM将在内部用锁替换逻辑。这是我的理解。我以为您指的是
java.util.concurrent.locks
(和/或
synchronized
等价物)。当然,我不知道内部JVM代码中发生了什么。如果我们讨论Java可以运行的各种/所有可能的体系结构,那么很难给出关于惩罚/性能的一般性说明。在这种情况下,我只能向您推荐性能调优的黄金法则:“始终衡量您的情况”。Atomic*类可能会使用锁,但在运行在典型、现代、服务器或工作站硬件上的大多数实际JVM中可能不会使用锁。CAS仅在某些体系结构上可用;其他架构使用不同的指令(例如,加载链接和存储条件)来实现相同的目的。