小编Ily*_* K.的帖子

方法iterator()在java.util.Collection和java.lang.Iterable中声明,它的超级接口?

有人可以向我解释为什么Iterator<E> iterator();定义的方法java.util.Collection?收藏已经延伸java.lang.Iterable; 这种方法是多余的.这是为了方便吗?

java collections

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

Java增量基准

我对多线程增量的最佳性能进行了调查.我检查了基于同步,AtomicInteger和自定义实现的实现,如AtomicInteger,但使用parkNanos(1),对失败的CAS.

private int customAtomic() {
        int ret;
        for (;;) {
            ret = intValue;
            if (unsafe.compareAndSwapInt(this, offsetIntValue, ret, ++ret)) {
                break;
            }
            LockSupport.parkNanos(1);
        }
        return ret;
    }
Run Code Online (Sandbox Code Playgroud)

我基于JMH做了基准:明确执行每个方法,每个方法都消耗CPU(1,2,4,8,16次)并且只消耗CPU.每个基准测试方法在1-17线程上在Intel(R)Xeon(R)CPU E5-1680 v2 @ 3.00GHz,8 Core + 8 HT 64Gb RAM上执行.结果让我感到惊讶:

  1. CAS在1个线程中最有效.2个线程 - 与监视器类似的结果.3以上 - 比监视器差,~2次.
  2. 在大多数情况下,自定义实现比监视器好2-3倍.
  3. 但在自定义实现中,随机有时会发生执行不良.好的案例 - 50 op/microsec.,坏案例 - 0.5 op/microsec.

问题:

  1. 为什么AtomicInteger不是基于同步,它更有效率,然后是当前的impl?
  2. 为什么AtomicInteger不使用LockSupport.parkNanos(1),CAS失败?
  3. 为什么自定义实现会出现这种高峰?

CustomIncrementGraph

我尝试执行此测试几次,并且spike总是发生在不同的数字线程中.另外我在另一台机器上试过这个测试,结果是一样的.也许这是测试中的问题.在StackProfiler中自定义impl的"坏情况"中,我看到:

....[Thread state distributions]....................................................................
 50.0%         RUNNABLE
 49.9%         TIMED_WAITING

....[Thread state: RUNNABLE]........................................................................
 43.3%  86.6% sun.misc.Unsafe.park
  5.8%  11.6% com.jad.generated.IncrementBench_incrementCustomAtomicWithWork_jmhTest.incrementCustomAtomicWithWork_thrpt_jmhStub
  0.8%   1.7% org.openjdk.jmh.infra.Blackhole.consumeCPU
  0.1%   0.1% com.jad.IncrementBench$Worker.work
  0.0%   0.0% java.lang.Thread.currentThread …
Run Code Online (Sandbox Code Playgroud)

java atomic increment jmh

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

Java无锁性能JMH

我有一个JMH多线程测试:

@State(Scope.Benchmark)
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@Fork(value = 1, jvmArgsAppend = { "-Xmx512m", "-server", "-XX:+AggressiveOpts","-XX:+UnlockDiagnosticVMOptions",
        "-XX:+UnlockExperimentalVMOptions", "-XX:+PrintAssembly", "-XX:PrintAssemblyOptions=intel",
        "-XX:+PrintSignatureHandlers"})
@Measurement(iterations = 5, time = 5, timeUnit = TimeUnit.SECONDS)
@Warmup(iterations = 3, time = 2, timeUnit = TimeUnit.SECONDS)
public class LinkedQueueBenchmark {
private static final Unsafe unsafe = UnsafeProvider.getUnsafe();
private static final long offsetObject;
private static final long offsetNext;

private static final int THREADS = 5;
private static class Node {
    private volatile Node next;
    public Node() {}
}

static {
    try { …
Run Code Online (Sandbox Code Playgroud)

java multithreading nonblocking memory-barriers jmh

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