0

我有一个存储大量对象的缓冲池。为了防止不同的线程写入同一个对象,同时为了提高效率,我使用ReadWriteLock. 但我不太确定它是如何工作的。找到我要访问的对象后,

if(perm.equals(Permissions.READ_ONLY)) {                    
  readLock.lock();
} else if(Permissions.READ_WRITE) {                 
  writeLock.lock(); 
}
return the object I want to access

系统如何知道程序试图访问和锁定哪个对象?或者我这里的语法是错误的?帮助!!!谢谢

4

2 回答 2

1

系统不知道您要锁定什么。如果您想为一系列项目使用锁定对象,则必须为每个项目设置一个锁,或者为整个对象集使用一个锁(这可能是一个很大的瓶颈)。这是一个使用单个锁来同步访问的示例。

// 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-15T00:08:06.643 回答
0

我儿子不知道java中有任何WriteReadLock,所以我假设你在谈论ReadWriteLock,首先ReadWriteLock只是一个接口。您需要在某处声明像 ReentrantReadWriteLock 这样的实现。正是这个实例维护了非独占读锁和独占写锁。

锁定实例是运行时获取监视器的对象。看看它的实现,它只是在常规旧wait()notify(), 和notifyall(). 您调用以获取锁实例。lock()当你开始和完成时你打电话unlock()

除此之外,最好的做法是在 try-catch-finally 和 finally 中使用锁,unlock以确保无论如何它都会被解锁。

于 2012-05-14T23:29:08.647 回答