如何使所有类方法仅在单个线程上运行?(同步类?



我知道synchronized关键字使方法一次只在单个类上运行。但问题来了。

我有一个带有方法的数据库类,例如insertAccountupdateSetting等。如果我insertAccountupdateSetting同步,它们中的每一个一次只能在一个线程上运行。

如果整个数据库有一种方法,那就太好了,但没有一种方法。如果一个线程同时调用insertAccount,另一个线程调用updateSetting,它会变坏,对吧?

因为任何时候都只能运行其中一种方法。那我该怎么办?

有没有办法将synchronized之类的东西应用于整个班级?因此,如果第一个线程同时调用insertAccount第二个线程调用updateSetting,则第二个线程必须等到第一个线程完成访问数据库。

真正的答案是:退后一步,做一些学习。您不应该在这里使用同步,而应该查看读取器/写入器在转向该"数据库类">之前需要获取的锁定对象。有关更多信息,请参阅此处。

另一方面,您应该了解什么是事务,以及您的数据库如何支持这些事务。意思是:有不同类型的问题;不同的层(应用程序代码、数据库(有不同的职责

你看,使用"反复试验"不是一种在这里行不通的方法。你应该花一些认真的时间学习基本概念。否则,您将面临损坏数据集的风险;更糟糕的是:您冒着编写大多数时间都运行良好的代码的风险;但以"随机"的方式晦涩失败。因为当多个线程以不受控制的方式操作共享数据时,就会发生这种情况。

你误解了synchronized的工作方式。

如果通过synchronized标记两个类方法,则在任何时刻只能执行其中一个(除非调用wait(。

另请注意,如果您有此类的多个实例,则可以同时执行不同实例的方法。

@Test(singleThreaded = true( 使用上面的注释 上面的类,它的测试将使用单个线程运行,即使您在testng.xml文件中使用了parallel="methods">

最新更新