我的应用程序需要保留对某个资源的请求访问日志,并且多个线程将记录日志条目。唯一相关的信息是请求的时间戳,正在检索的统计数据将是在最后 X 秒内发生了多少请求。返回给定秒数的统计信息的方法也需要支持多线程。
我正在考虑使用我不是最熟悉的Locks框架来处理并发处理,因此这个问题。这是我的代码:
import java.util.LinkedList;
import java.util.concurrent.locks.ReentrantLock;
public class ConcurrentRecordStats
{
private LinkedList<Long> recLog;
private final ReentrantLock lock = new ReentrantLock();
public LinkedConcurrentStats()
{
this.recLog = new LinkedList<Long>();
}
//this method will be utilized by multiple clients concurrently
public void addRecord(int wrkrID)
{
long crntTS = System.currentTimeMillis();
this.lock.lock();
this.recLog.addFirst(crntTS);
this.lock.unlock();
}
//this method will be utilized by multiple clients concurrently
public int getTrailingStats(int lastSecs)
{
long endTS = System.currentTimeMillis();
long bgnTS = endTS - (lastSecs * 1000);
int rslt = 0;
//acquire the lock only until we have read
//the first (latest) element in the list
this.lock.lock();
for(long crntRec : this.recLog)
{
//release the lock upon fetching the first element in the list
if(this.lock.isLocked())
{
this.lock.unlock();
}
if(crntRec > bgnTS)
{
rslt++;
}
else
{
break;
}
}
return rslt;
}
}
我的问题是:
- 这种使用会
ReentrantLock
确保线程安全吗? - 是否需要使用锁定
getTrailingStats
? - 我可以使用
synchronized
积木来完成所有这些吗?我使用锁的原因是因为我希望在 R 和 W 部分拥有相同的锁,以便列表中第一个元素(最近添加的条目)的写入和读取一次完成一个线程,我无法做到这一点synchronized
。 - 我应该改用ReentrantReadWriteLock吗?