我看到Java的AtomicInteger如何在内部使用CAS(比较和交换)操作.基本上,当多个线程尝试更新值时,JVM在内部使用底层CAS机制并尝试更新该值.如果更新失败,则再次尝试使用新值但从不阻止.
在Java8中,Oracle引入了一个新的类LongAdder,它在高争用下似乎比AtomicInteger表现更好.一些博客文章声称LongAdder通过维护内部单元格表现更好 - 这是否意味着LongAdder在内部聚合值并在以后更新它?你能帮我理解LongAdder的工作原理吗?
我知道当新的对象分配失败或调用System.gc()时会触发GC.每个GC算法都建议,作为第一步,GC线程将挂起所有应用程序线程,以便它们不会影响GC活动.
但我想了解GC如何挂起所有正在运行的线程?我的意思是JVM定义了任何安全点,例如,内存分配(新对象创建)或方法调用,当应用程序线程到达这些安全点时,它们将被阻止以防止GC锁定.这是真的吗?如果是这样,那么如何只执行如下简单计算的应用程序线程(我知道实际上这永远不会发生),它会被暂停吗?
while(true) {
a = a + s;
s = s + a;
// some computation that doesn't touch any JVM safe points
}
Run Code Online (Sandbox Code Playgroud)
在这些情况下,GC活动是否会在不挂起这些应用程序线程的情况下继续(并在以后尝试跨越安全点时暂停/阻止,例如对象分配)?
但我相信,GC始终等待这些应用程序线程进入安全点并在继续之前暂停它们.我的假设是真的吗?