我在多线程环境(Play 2 Java
、MySQL
、Hibernate
)中运行的单例对象中有以下方法:
@Transactional
void deleteItem(int itemId, int userId) {
.....
synchronized(this) {
if(getItemCount(userId) < 2) { // go to database to get the count
return;
}
if(!userOwnItem(itemId, userId) { // check if item belongs to user
return;
}
delete(itemId); // go to db to delete the item
}
....
}
我很难理解为什么在并发运行时偶尔会低于 1。
最佳答案
你的方法不是静态的,所以你的同步锁只在当前对象上synchronized(this)
。
我想这个方法不是来自单例对象,所以你可以同时拥有 4 个 this 对象(4 个客户端在异步调用中连接到 4 个不同的线程),其中 3 个调用 'deleteItem' ... .然后你立刻得到了-3。
您需要在类 synchronize(MyDb.class)
上进行同步或将此对象转换为单例。
关于Java Hibernate 多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33819817/