【发布时间】:2020-12-09 23:47:56
【问题描述】:
我想使用https://micrometer.io/docs/concepts#_gauges 计算正在运行的 RunInAThread 实例的数量。从文档中,最好在集合上创建一个仪表(我没有),或者使用像 AtomicInteger 这样的东西。
但是,我需要一个 AtomicInteger 的静态实例,并且必须使用作为成员变量的 MeterRegistry 对其进行初始化。这样做的最佳做法是什么?我不想采用标准的单例模式,因为这意味着我总是必须调用 getInstance() 来获取 AtomicInteger 实例,而且每次都必须同步。
有没有比我现在做的更好的方法?
public class RunInAThread implements Runnable {
private static AtomicInteger GAUGE = null;
public RunInAThread(final MeterRegistry registry) {
synchronized(this) {
if(GAUGE==null) {
GAUGE = registry.gauge("some_name", Collections.emptySet(), new AtomicInteger());
}
}
}
@Override
public void run() {
GAUGE.incrementAndGet()
doSomething();
GAUGE.decrementAndGet()
}
private void doSomething() {
// processing like a boss in a while loop
}
}
【问题讨论】:
-
请注意,您使用 run() 方法的方法已损坏。正确的做法是将 doSomething 放在 try/finally 块中,将 decrementAndGet 放在 finallyt 块中。否则,如果您的线程以异常方式结束,则 GAUGE 永远不会递减。
-
好的,谢谢。为了简化,我省略了 try/finally 块。
标签: java spring synchronization prometheus micrometer