Java Hibernate 多线程

标签 java mysql multithreading hibernate playframework

我在多线程环境(Play 2 JavaMySQLHibernate)中运行的单例对象中有以下方法:

@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/

相关文章:

java - 我们可以让 JVM 抛出我们自己的用户定义的异常吗?

java - 如何将 Android 模拟器与 NetBeans 上的 Web 服务连接?

java - 迭代 R.string.name

javascript - 使用 Node.js 和 Express.js 在 MySQL 中删除给定值数组的多行

mysql - 列出客户表中的所有记录

java - 创建新的 Spring Roo 项目时名称非法

php - WordPress 更新查询不起作用,返回 false

python - 如何编写无需退出应用程序即可 self 更新的python代码?

multithreading - <thread> get_id() 和 native_handle() 之间的 C++11 区别

java - 将任务从 EDT 分派(dispatch)到 main?