我想实现一个CoreLocal映射,它就像ThreadLocal一样,只返回一个特定于当前线程运行的核心的值.
这样做的原因是我想编写将从队列中获取作业的代码,但我想优先考虑那些将其关联数据放在与从队列中挑选作业的线程相同的L1缓存的作业.因此,我想为整个程序创建一个队列,而不是每个核心都有一个队列,只有当队列为空时,工作线程才会查看其他核心的队列.
我有一个已安装另一个存储库的存储库
git subtree add -P some/path otherremote otherbranch
Run Code Online (Sandbox Code Playgroud)
开发已经发生了一些局部变化,但也进行了几轮合并:
git fetch otherremote
git subtree merge -P some/path otherremote/otherbranch
git commit
Run Code Online (Sandbox Code Playgroud)
现在我想在otherremote/otherbranch的HEAD和某些/ path的树之间获得差异.我怎样才能做到这一点?
我们使用AtomicLongs收集一些统计信息。一些用户看到了关于这些的争执,并建议改用LongAdder。但是,正如我们目前使用Atomic所做的那样,我认为无法计算最大值:
AtomicLong _current, _total, _max;
...
void add(long delta)
{
long current = _current.addAndGet(delta);
if (delta>0)
{
_total.addAndGet(delta);
long max = _max.get();
while (current > max)
{
if (_max.compareAndSet(max, current))
break;
max = _max.get();
}
}
Run Code Online (Sandbox Code Playgroud)
因此,我认为我们可以_total
很容易地用替换掉LongAdder
,但是因为这样做_current.addAndGet(delta)
对a LongAdder
来说效果不好,也不能对_max值进行cas操作。
是否有任何好的算法可以基于LongAdder
或类似的可伸缩无锁构造收集此类统计信息?
实际上,尽管我要询问,但我们的统计信息通常会更新6至10个AtomicLongs。如果无论如何我们都在争论,那么仅仅抓住一个锁并更新6到10个正常的长仓可能会更好吗?
java ×2
concurrency ×1
core ×1
git ×1
git-diff ×1
git-subtree ×1
java-8 ×1
java-9 ×1
jetty ×1
performance ×1
servlets ×1
statistics ×1