我知道synchronized
关键字使方法一次只在单个类上运行。但问题来了。
我有一个带有方法的数据库类,例如insertAccount
、updateSetting
等。如果我insertAccount
,updateSetting
同步,它们中的每一个一次只能在一个线程上运行。
如果整个数据库有一种方法,那就太好了,但没有一种方法。如果一个线程同时调用insertAccount
,另一个线程调用updateSetting
,它会变坏,对吧?
因为任何时候都只能运行其中一种方法。那我该怎么办?
有没有办法将synchronized
之类的东西应用于整个班级?因此,如果第一个线程同时调用insertAccount
第二个线程调用updateSetting
,则第二个线程必须等到第一个线程完成访问数据库。
真正的答案是:退后一步,做一些学习。您不应该在这里使用同步,而应该查看读取器/写入器在转向该"数据库类">之前需要获取的锁定对象。有关更多信息,请参阅此处。
另一方面,您应该了解什么是事务,以及您的数据库如何支持这些事务。意思是:有不同类型的问题;不同的层(应用程序代码、数据库(有不同的职责。
你看,使用"反复试验"不是一种在这里行不通的方法。你应该花一些认真的时间学习基本概念。否则,您将面临损坏数据集的风险;更糟糕的是:您冒着编写大多数时间都运行良好的代码的风险;但以"随机"的方式晦涩失败。因为当多个线程以不受控制的方式操作共享数据时,就会发生这种情况。
你误解了synchronized
的工作方式。
如果通过synchronized
标记两个类方法,则在任何时刻只能执行其中一个(除非调用wait
(。
另请注意,如果您有此类的多个实例,则可以同时执行不同实例的方法。
@Test(singleThreaded = true( 使用上面的注释 上面的类,它的测试将使用单个线程运行,即使您在testng.xml文件中使用了parallel="methods">