上个月写了一个统计的计数器。下边是一个在多线程并发访问下,计数的类。用于监控报警,先贴代码,有空了再解读给大家
import java.util.concurrent.atomic.AtomicReference;
public class RequestCounter {
private final AtomicReference<Accumulator> values;
private final int durationMS;
public RequestCounter(int durationMS) {
this.values = new AtomicReference<Accumulator>(new Accumulator());
this.durationMS = durationMS;
}
public long getCount() {
return getValidAccumulator().count;
}
public long getTotalCount() {
return getValidAccumulator().total;
}
public double getAverageTimeInMs() {
return getValidAccumulator().getAverageTimeMS();
}
public float getThroughput() {
Accumulator oldv = getValidAccumulator();
double elapsed = (System.currentTimeMillis() - oldv.startTimeMS) / 1000;
if (elapsed > 0f) {
return (float) (oldv.count / elapsed);
} else {
return -1f;
}
}
private Accumulator getValidAccumulator() {
Accumulator accum = values.get();
long now = System.currentTimeMillis();
if (now - accum.startTimeMS <= durationMS) {
return accum;
}
Accumulator newWithTotal = accum.newWithTotal();
if (values.compareAndSet(accum, newWithTotal)) {
return newWithTotal;
}
return values.get();
}
public void addRequest(long timeNS) {
for (int i = 0; i < 3; i++) {
Accumulator oldv = getValidAccumulator();
long startTimeMS = oldv.startTimeMS;
long count = oldv.count + 1;
long totalTimeNS = oldv.totalTimeMS + timeNS;
long total = oldv.total + 1;
if (values.compareAndSet(oldv, new Accumulator(startTimeMS, count,
totalTimeNS, total))) {
return;
}
}
}
private static class Accumulator {
final long startTimeMS;
final long count;
final long totalTimeMS;
final long total;
public Accumulator() {
this(System.currentTimeMillis(), 0, 0, 0);
}
public Accumulator newWithTotal() {
return new Accumulator(System.currentTimeMillis(), 0, 0, total);
}
public Accumulator(long startTimeMS, long count, long totalTimeMS,
long total) {
this.startTimeMS = startTimeMS;
this.count = count;
this.totalTimeMS = totalTimeMS;
this.total = total;
}
public double getAverageTimeMS() {
return count > 0 ? 1f * totalTimeMS / count : -0f;
}
}
}
分享到:
相关推荐
在提供的压缩包文件中,"安全稳定的实现进线程监控.txt"可能是详细讲解线程监控实现的文档,而"www.pudn.com.txt"可能是一个指向更多资源的链接,例如在PUDN论坛上讨论的详细教程或源代码。 总的来说,安全稳定的...
更复杂的应用可能涉及到多线程或异步操作,比如在网络请求中统计成功或失败的次数。在这种情况下,为了确保线程安全,可能需要使用`Interlocked`类或`lock`关键字来同步对计数器的访问。 此外,C#中的`System....
在多线程环境中,还可以用来评估不同任务之间的同步和竞争情况。 2. **CPU时钟周期**:CPU时钟周期是处理器完成一次基本操作的时间。通过统计CPU时钟周期,我们可以了解代码对处理器的使用效率。较低的时钟周期数...
在IT行业中,多线程编程和实时传输协议(RTP)是两个重要的概念,尤其是在网络通信和音频视频处理领域。本项目"多线程精确20ms定时器RTP发包转发收包压力测试工具"显然是针对这些技术的实践应用。下面我们将详细探讨...
这个计数值通常以原子整型(AtomicInteger)的形式存在,因为它是线程安全的,可以避免多线程环境下同步问题导致的错误计数。以下是一个简单的Servlet计数器示例: ```java import javax.servlet.http.HttpServlet;...
在实际开发中,计数器类可能还需要考虑线程安全问题,特别是在多线程或多进程环境中。为了确保计数的准确性,可能需要引入锁或其他同步机制,以防止并发访问时出现数据不一致。例如,在Java中,可以使用`...
它涵盖了数据库管理、多线程编程、用户交互等多个关键知识点,是实践数据库应用和Web开发技能的理想平台。通过分析和修改这款计数器的源码,学生可以加深对实际项目开发流程的理解,提升问题解决和代码调试的能力。 ...
性能调优可以帮助vCenter Server应对更多的虚拟机负载,而性能监控则能够帮助管理员及时发现和解决潜在问题,从而避免vCenter Server成为整个虚拟化环境的瓶颈。 性能调优通常包括以下几个方面: 1. 硬件资源优化...
这些计数器涵盖了多个方面,包括JVM(Java虚拟机)、JDBC连接池和线程池的性能指标。了解并分析这些计数器的数据可以帮助管理员优化系统资源利用率,确保应用的稳定性和高效运行。 1. **JVM运行时计数器**: - **...
- **线程安全**:所有的Simon操作都是线程安全的,这意味着在多线程环境中无需额外的同步措施。 - **轻量级**:Java Simon的体积小,对应用程序的性能影响极小,适合嵌入到各种项目中。 集成Java Simon到你的项目中...
7. **处理多线程和异步操作**:为了不阻塞用户界面,可以使用多线程或异步IO。例如,使用`WSAAsyncSelect`或`WSAEventSelect`来注册事件通知,当有新的数据可读或可写时,系统会触发预先设定的事件。 8. **日志记录...
3. **线程安全**:考虑到多线程环境,我们需要确保计数器的增加操作是线程安全的。可以使用`AtomicInteger`或`synchronized`关键字来保证并发访问时的正确性。 4. **持久化**:访问量数据通常需要持久化存储,以便...
3. **多线程处理**:在C#中,System.Threading命名空间提供了线程和同步工具,用于处理并发请求和异步操作。这在远程监控中非常重要,因为系统可能需要同时接收和处理多个监控数据流。 4. **日志记录**:为了跟踪和...
这可能涉及到线程安全的计数器,如Java的`AtomicInteger`,确保在多线程环境下正确地增加和减少在线用户计数。 7. **负载均衡与集群**:在分布式环境中,需要考虑如何在多个服务器之间共享会话和统计信息。可以通过...
5. **多维度统计**:除了基础的计数器和平均值,MyPerf4J还支持百分位数、标准差等统计维度,为性能分析提供了丰富的数据支持。 6. **日志记录与报告**:MyPerf4J可以将收集到的性能数据记录到日志文件,并定期生成...
这通常涉及到多线程、异步编程和设计模式的应用。 6. **第三方库**:有一些第三方库如NLog、Serilog等,提供了更高级的日志管理和分布式日志追踪功能,便于在复杂系统中进行监控。 7. **网络监控**:如果系统涉及...
1. 使用AtomicInteger:`AtomicInteger`是线程安全的,可以保证在多线程环境下的正确性。例如: ```java import java.util.concurrent.atomic.AtomicInteger; public class EventCounter { private AtomicInteger...
在该页面中勾选“启用性能监控基础结构(PMI)”,并在“当前监控的统计信息集”中选择“定制”方式。之后点击应用并进入“定制监控级别”。 3. **定制监控级别**: - 在此步骤中,需要根据实际需求启用一系列的监控...
一个进程可以包含多个线程,它们共享同一地址空间,但拥有各自的执行路径。查看进程中的线程可以帮助我们理解程序运行时的情况,比如CPU使用率高的原因可能是某个线程在进行密集计算,或者线程间通信出现问题导致的...