我是多线程的新手,但我有一些基本问题,无法获得答案。假设我有一个名为BankTransaction的类,并且我想在那里处理多线程情况。
案例1(基于应用程序的单例)
@Singleton (Application based singleton)
class BankTransaction {
synchronized void doSomeTransaction() {
// write operation
}
}
情况2(基于请求的单例)
@Singleton (Request based singleton)
class BankTransaction{
synchronized void doSomeTransaction() {
// write operation
}
}
问题
请忍受并用通俗易懂的方式向我解释,因为我需要清除所有内容。
在案例1中,如果1000个用户正在使用BankTransaction类的同一实例(因为它是基于应用程序的单例),并且使用方法doSomeTransaction(),则1000个用户中每个用户的请求是否缓慢?因为它是同步的并且将在线程安全的环境下工作。因此,这是不好的方法。我的理解正确吗?
在案例2中,如果相同的1000个用户正在使用BankTransaction类的doSomeTransaction()方法,则每个用户都将获得自己的BankTransaction类实例,并且对于任何一个用户来说,它都不会变慢。但是当我说例如这1000个用户中有2个彼此密切相关(丈夫和妻子)并正在访问同一银行帐户并同时执行doSomeOperation()方法时,我该如何处理竞争条件。我该如何处理?因为它们都再次具有BankTransaction类的2个不同实例,并且会发生数据不一致。
最佳答案
是。您的理解是正确的。如果您不希望允许多个用户更改对象的状态,则应使方法同步。该示例可以是应用程序级配置对象。
现在,有很多解决方案。最简单的方法可能是将此问题推迟到某些ORM解决方案,该解决方案可以进一步使用记录级别锁定技术或其他任何方法。但是,如果要手动处理此问题,最简单的方法是在db中维护一列。现在,每次修改记录时,都应该增加该值。在提交记录之前,应检查该值是否与从db中获取的记录的值相同。如果相同,那么可以确定自从开始事务以来没有人修改过它。但是,如果值不相同,则可以向用户抛出错误,指出记录已被其他用户修改。