Java 使方法同步是否可以确保它是线程安全的?

Java 使方法同步是否可以确保它是线程安全的?,java,database,multithreading,Java,Database,Multithreading,我有一种方法,其中一些数据库插入操作是使用hibernate进行的,我希望它们是线程安全的。该方法在参数中获取一些数据,有时可能在同一时间点使用相同的数据进行两次调用 由于性能下降,我无法锁定这些表。是否有人建议将该方法设置为同步将解决此问题?同步一个方法将确保一次只能由一个线程访问它。如果此方法是写入数据库的唯一方法,则是,这将停止两个线程同时写入。但是,您仍然需要处理一个事实,即您有多个使用相同数据的插入操作。同步一个方法将确保一次只能由一个线程访问它。如果此方法是写入数据库的唯一方法,则是

我有一种方法,其中一些数据库插入操作是使用hibernate进行的,我希望它们是线程安全的。该方法在参数中获取一些数据,有时可能在同一时间点使用相同的数据进行两次调用


由于性能下降,我无法锁定这些表。是否有人建议将该方法设置为同步将解决此问题?

同步一个方法将确保一次只能由一个线程访问它。如果此方法是写入数据库的唯一方法,则是,这将停止两个线程同时写入。但是,您仍然需要处理一个事实,即您有多个使用相同数据的插入操作。

同步一个方法将确保一次只能由一个线程访问它。如果此方法是写入数据库的唯一方法,则是,这将停止两个线程同时写入。但是,您仍然必须处理这样一个事实,即您有多个对同一数据的插入操作。

您应该让Hibernate处理并发性,这就是它要做的。不要假设Hibernate会锁定任何东西:它支持的正是这个目的。引用上述链接:

唯一与高并发性和高可伸缩性保持一致的方法是带有版本控制的乐观并发控制。版本检查使用版本号或时间戳来检测冲突的更新并防止更新丢失。Hibernate提供了三种可能的方法来编写使用乐观并发的应用程序代码


您应该让Hibernate处理并发性,这就是它要做的。不要假设Hibernate会锁定任何东西:它支持的正是这个目的。引用上述链接:

唯一与高并发性和高可伸缩性保持一致的方法是带有版本控制的乐观并发控制。版本检查使用版本号或时间戳来检测冲突的更新并防止更新丢失。Hibernate提供了三种可能的方法来编写使用乐观并发的应用程序代码


不可以。此方法可能使用其他方法和对象,这些方法和对象可能不是线程安全的
synchronized
使线程一次只能使用该方法的对象
monitor
,因此它使线程安全成为与该对象相关的方法


如果您确定所有其他线程仅使用此方法的共享功能,则将其同步化就足够了。

否。此方法可能使用其他方法和对象,这可能不是线程安全的
synchronized
使线程一次只能使用该方法的对象
monitor
,因此它使线程安全成为与该对象相关的方法


如果您确定所有其他线程仅使用此方法共享功能,那么将其同步就足够了。

选择最佳策略取决于体系结构,有时使用方法同步之类的技巧似乎更容易提高性能,但这是一种不好的方法

毫无疑问,您应该使用事务,如果使用该策略您面临性能问题,您应该优化您的数据库查询或数据库结构


请记住,“同步”应该尽可能原子化。

选择最佳策略取决于体系结构,有时使用方法同步之类的技巧似乎更容易提高性能,但这是一种糟糕的方法

毫无疑问,您应该使用事务,如果使用该策略您面临性能问题,您应该优化您的数据库查询或数据库结构


请记住,“同步”应该尽可能原子化。

数据库并发由事务处理。事务具有原子一致性隔离持久性(ACID)属性。它们在并发访问数据库的程序之间提供隔离。在spring框架的Hibernate DAO模板中,有用于数据库CRUD操作的单行方法。单独使用时,这些不需要通过方法同步。如果您需要使用特定的传播设置、回滚设置和隔离设置将“您的方法”声明为事务性的,Spring将提供声明性(XML)、编程和注释元数据驱动的事务管理。因此,在“您的方法”中,您可以执行多次保存、更新、删除等操作,ORM将确保使用您在元数据中给定的事务设置执行该操作

另一个问题是线程必须锁定所有参与事务的对象。否则事务可能会失败,或者ORM将保留过时的数据。在另一种情况下,由于锁的顺序,它可能导致死锁。我想这才是真正回答你问题的原因

对象a和b都有一个Lock类型的实例变量。布尔标志可用于指示事务的成功。如果同一事务失败,客户端代码可以重试该事务

             if (a.lock.tryLock()) {
                try {
                    if (b.lock.tryLock()) {
                        try {
                            // persist or update object a and b
                        } finally {
                            b.lock.unlock();
                        }
                    }
                } finally {
                    a.lock.unlock();
                }
            }

使用同步方法的问题在于它会锁定整个服务或DAO类,从而使其他线程无法使用其他服务方法。通过对对象使用单独的锁,我们可以获得细粒度并发的优势。

数据库并发由事务处理。事务具有原子一致性隔离持久性(ACID)属性。它们在并发访问数据库的程序之间提供隔离。在spring框架的Hibernate DAO模板中,有用于数据库CRUD操作的单行方法。单独使用时,这些不需要通过方法同步。Spring提供声明式(XML)、编程式和anno