我对Java中的并发访问有疑问。
项目上下文如下:JSF 2.1; Richfaces 4,休眠3.6,春季3.2,Java 7。
我有一个显示数十万个文件夹的表(每个文件夹是一个Java对象,每个表行都是一个动态链接,用于访问对象(文件夹)的咨询或修改。
我的问题是:如何防止多个用户查看或编辑文件夹?
换句话说,如何同时检测到多个用户对文件夹(对象java)的访问?
我知道使用Synchronized on methods一词可以阻止并发访问,但是我想检测并发访问,以警告其他用户或其他用户文件夹(对象java)已经打开,我们必须等待因为它关闭了。
谢谢
为每个表创建一个Lock
:
private Lock lock=new ReentrantLock();
开始使用表时,尝试获取锁或(如果失败)显示错误消息。
最后(如果您不再需要该表,则将其放弃。
boolean ok=lock.tryLock();
if(ok){
try{
// do whatever you want to do
}finally{
lock.unlock();
}
}else{
//error
}
如果无法最终尝试,请确保在不需要时解锁Lock
。
[ReentrantLock
是特殊的Lock
,如果您已获取同一线程,就可以获取它。
如果您不需要显示错误消息并且可以阻塞直到表可用,则可以只使用synchronized
。
为了做到这一点,您只需将synchronized
添加到要保护的表类的每个方法中,或使用如下所示的同步块:
synchronized(table){
//do whatever you want
}