如何衡量执行一段代码的线程数?

Chr*_*lom 7 java concurrency monitoring multithreading semaphore

我试图测量有多少线程同时执行一段代码.目前我(ab)使用信号量,有更好的方法吗?

final int MAX_THREADS = Integer.MAX_VALUE;

Semaphore s = new Semaphore(MAX_THREADS);

s.acquire(); // start of section

// do some computations

// track how many threads are running the section
trackThreads( (MAX_THREADS - s.availablePermits()) );         

s.release(); // end of section
Run Code Online (Sandbox Code Playgroud)

Hen*_*sen 6

使用AtomicInteger而不是a Semaphore.

有点像:

AtomicInteger count = new AtomicInteger();

count.getAndIncrement();

// do some computations

// track how many threads are running the section
trackThreads( count.get() );         

count.getAndDecrement(); // end of section
Run Code Online (Sandbox Code Playgroud)


Eug*_*ene 5

AtomicInteger是个好建议,但由于 java-8LongAdder更适合高竞争环境。

不同之处在于,当CAS失败时,AtomicInteger会再试一次——直到成功。ALongAdder当它失败时CAS(里面有一个自旋锁),将创建一个“失败”的值数组(如果我没记错的话,仅限于 CPU 的数量)。当您最终请求它的当前值时 - 所有那些“失败”的值都会添加到结果中。事实证明,此策略比 快得多AtomicInteger