我有一个bufferPool,它存储了很多对象。为了防止不同的线程写入相同的对象,同时为了提高效率,我使用了ReadWriteLock。但我不太确定它是如何工作的。在我找到想要访问的对象之后,
if(perm.equals(Permissions.READ_ONLY)) {
readLock.lock();
} else if(Permissions.READ_WRITE) {
writeLock.lock();
}
return the object I want to access系统如何知道程序正在尝试访问和锁定哪个对象?或者我这里的语法是错误的?救命!谢谢
发布于 2012-05-15 08:08:07
系统不知道您要锁定的是什么。如果您想对一系列项目使用锁对象,则必须为每个项目设置一个锁,或者为整个对象集使用一个锁(这可能是一个很大的瓶颈)。这是一个使用单个锁来同步访问的示例。
// You'll need to create this somewhere else, in your constructor
// or some other routine that gets called once.
ReentrantLock lock = new ReentrantLock();
// Then when you want to access:
lock.lock();
try {
... // do stuff with the data
}
finally {
lock.unlock();
}发布于 2012-05-15 07:29:09
我不知道java中有什么WriteReadLock,所以我假设你说的是ReadWriteLock,首先ReadWriteLock只是一个接口。您需要在某个地方声明一个类似于ReentrantReadWriteLock的实现。正是这个实例维护了非独占读锁和独占写锁。
锁实例是运行库获取监视器的对象。看看它的实现,它只是在常规的旧wait(),notify()和notifyall()之上的一些幻想。您可以调用来获取锁实例。启动时调用lock(),完成时调用unlock()。
此外,最好的做法是在try-catch-finally中使用锁,在unlock中使用锁,以确保它无论如何都会被解锁。
https://stackoverflow.com/questions/10592234
复制相似问题