小编Sat*_*ish的帖子

LongAdder的表现如何比AtomicLong更好

我看到Java的AtomicInteger如何在内部使用CAS(比较和交换)操作.基本上,当多个线程尝试更新值时,JVM在内部使用底层CAS机制并尝试更新该值.如果更新失败,则再次尝试使用新值但从不阻止.

在Java8中,Oracle引入了一个新的类LongAdder,它在高争用下似乎比AtomicInteger表现更好.一些博客文章声称LongAdder通过维护内部单元格表现更好 - 这是否意味着LongAdder在内部聚合值并在以后更新它?你能帮我理解LongAdder的工作原理吗?

java concurrency

19
推荐指数
2
解决办法
7108
查看次数

GC如何挂起/阻止应用程序线程

我知道当新的对象分配失败或调用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始终等待这些应用程序线程进入安全点并在继续之前暂停它们.我的假设是真的吗?

java garbage-collection

1
推荐指数
1
解决办法
1049
查看次数

标签 统计

java ×2

concurrency ×1

garbage-collection ×1