System.currentTimeMillis()的调用比new一个普通对象要耗时的多(具体耗时高出多少我还没测试过,有人说是100倍左右),然而该方法又是一个常用方法,有时不得不使用,比如日志,在高并发情形下怎么做才好呢?
System.currentTimeMillis()之所以慢是因为去跟系统打了一次交道,什么快?内存!如果该方法从内存直接取数,那岂不是相当快,看代码:
class MillisecondClock {
private long rate = 0;// 频率
private volatile long now = 0;// 当前时间
private MillisecondClock(long rate) {
this.rate = rate;
this.now = System.currentTimeMillis();
start();
}
private void start() {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(rate);
} catch (InterruptedException e) {
e.printStackTrace();
}
now = System.currentTimeMillis();
}
}).start();
}
public long now() {
return now;
}
public static final MillisecondClock CLOCK = new MillisecondClock(10);
}
用的时候直接CLOCK.now()即可,你可以适当的进行变形,比如调整更新频率,开放构造函数,设置daemon线程,改为懒汉模式等等。
如下图是同时开启100个线程,每个线程并发请求一亿次的结果,可见耗时相差16倍左右(环境:JDK 1.7 win7 64位 4核 4G)。
- 大小: 253.2 KB
分享到:
相关推荐
为了优化这种性能问题,我们可以考虑以下几种策略: 1. **缓存时间戳**:在多线程环境中,可以预先获取当前时间并存储在一个线程安全的数据结构(如`AtomicLong`)中,然后由各线程共享。这样减少了对系统调用的...
在Java编程中,遍历List集合是常见的操作,有多种方式可以实现这一功能。下面将详细探讨三种遍历List集合的...至于增强型`for`循环,虽然在性能上可能稍逊一筹,但其简洁性和易读性使得它在许多场景下仍然非常受欢迎。
4. 性能:如果在高并发环境中频繁调用此方法,可能会对系统性能造成影响,因为这需要同步硬件时钟和其他系统组件。 在实际开发中,通常不建议直接使用 `setCurrentTimeMillis()` 修改系统时间,除非有特殊的需求,...
在高并发或多线程环境中,这种方式可能会因为系统时间更新延迟而产生误差。 - **CPU时间与真实时间**:上述计时方法记录的是“墙钟时间”(wall clock time),即从计时开始到结束所经过的真实时间。但在实际应用中,...
该库包含了集合、缓存、原生类型支持、并发库、常见注解、字符串处理、I/O等多方面的功能,能够帮助开发者在不增加额外依赖的情况下实现更为简洁、高效的代码编写。 ### Strings处理 #### Joiner(合并字符串) `...
注意,这种方法虽然简单易用,但在高并发场景下可能会对性能产生一定影响,因为它会增加每次方法调用的开销。在生产环境中,如果需要精确的性能数据,建议使用专门的性能监测工具,如JProfiler或VisualVM。
NIO允许进行非阻塞I/O操作,可以在一定程度上缓解高并发下的性能瓶颈。 - **异步非阻塞I/O(AIO)**:随着硬件的发展和并发编程的需求增加,AIO成为了更先进的I/O模型。AIO允许异步发起I/O请求,无需等待数据传输...
这是一个非常常用的函数,尤其在需要记录事件发生时间或者进行定时任务等场景下。 ```java // 获取当前系统时间的时间戳 long currentTimestamp = System.currentTimeMillis(); // 输出当前时间的时间戳 System....
在Java多线程环境中,让主线程等待所有子线程执行完毕是一个常见的需求,尤其是在处理大量数据或进行高性能计算时。这不仅有助于正确测量整体执行时间,还能够确保资源的正确释放和数据的一致性。 #### 详细解析 *...
2. 创建大量日志事件,模拟高并发场景。 3. 使用System.currentTimeMillis()或其他性能度量工具记录开始时间。 4. 触发日志事件的生成,观察并记录处理时间。 5. 对比与同步模式下的性能,分析结果。 测试结果通常...
值得注意的是,虽然这种策略可以满足大多数情况,但在高并发场景下,仅依赖毫秒数可能会导致ID冲突,因为两个请求可能在同毫秒内被处理。为了解决这个问题,可以考虑使用更复杂的分布式ID生成方案,如Twitter的...
- **性能优化:** 需要注意Redis操作的性能问题,尤其是高并发场景下的性能瓶颈。 - **监控与告警:** 实现监控和告警机制,以便及时发现并解决潜在问题。 #### 5. 结束语 令牌桶算法作为一种有效的流量控制手段,在...
例如,在高并发环境下,系统时间的读取可能会受到调度延迟的影响,导致测量结果不准确。对于更高精度的需求,可以考虑使用 `System.nanoTime()`,它提供了纳秒级的时间戳,但需要注意的是,这种时间戳并不表示绝对...
本文主要讨论了在高并发场景下如何优化时间戳获取的性能问题,以及一个具体的开源项目——Cobar 和阿里巴巴的限流熔断工具 Sentinel 中采用的优化策略。 1. **时间戳获取的性能问题**: - 在Java中,`System....
在Java 5和Java 6中,JVM引入了大量的并发工具和改进,以支持多处理器和多核系统上的高性能应用程序。以下是这些知识点的详细说明: 1. **线程基础**:线程是操作系统分配CPU时间的基本单元,Java通过`Thread`类...
4. **并发测试**:模拟多线程或分布式环境,测试在高并发情况下的性能。 5. **结果分析**:收集测试数据,使用图形工具(如JProfiler或VisualVM)进行内存分析,或者使用像JMeter的报告功能来可视化性能指标。 在...
Redis 分布式锁是解决高并发场景下数据一致性与安全性的关键工具,尤其在Java开发中,被广泛应用。本文将深入探讨Redis分布式锁的工作原理、实现方式以及在Java中的应用。 **一、Redis分布式锁的概念** 分布式锁是...
然而,需要注意的是,这种方法虽然简单,但在高并发场景下可能会有性能问题,因为需要频繁扫描整个有序集合。为了解决这个问题,可以考虑使用`BLPOP`或`BRPOP`命令在消息队列中阻塞等待新任务,或者使用Redis的`...
Java 多线程实例 ...理解并掌握线程的创建、控制和同步是Java开发中不可或缺的部分,尤其在处理高并发和性能敏感的应用场景时。通过合理的线程管理和同步,开发者可以编写出高效、稳定的多线程应用程序。