我知道synchronized
关键字make方法一次只能在单个类上运行。但这是问题所在。
我有一个包含方法的数据库类,例如insertAccount
,updateSetting
等。如果我使insertAccount
,updateSetting
同步,则每个人都可以一次仅在一个线程上运行。
如果有一个整个数据库的方法,它会很棒,但没有一个。如果一个线程调用insertAccount
而另一个线程同时调用updateSetting
,它会变坏,对吧?
因为这些方法中只有一种可以随时运行。那我该怎么办?
有没有办法将synchronized
这样的东西应用到全班?因此,如果第一个线程同时调用insertAccount
和第二个线程调用updateSetting
,则第二个线程必须等到第一个线程完成访问数据库。
答案 0 :(得分:5)
这里的真实的答案:退一步做一些学习。您不应该在此处使用 synchronized ,而是查看读者/作者需要获取的锁定对象之前转向“DB”类”。有关详细信息,请参阅here。
另一方面,您应该了解事务是什么,以及数据库如何支持这些事务。含义:存在不同类型的问题;并且不同的层(应用程序代码,数据库)具有不同的职责。
你知道,使用“试错法”并不是一种可以在这里解决的方法。你应该花一些认真的时间研究基础概念。否则,您可能会损坏您的数据集;更糟糕的是:你冒着编写大多数时候工作正常的代码的风险;但是以“随机”的模糊方式失败。因为当多个线程以不受控制的方式操纵共享数据时会发生这种情况。
答案 1 :(得分:1)
你误解了synchronized
的工作方式。
如果您按synchronized
标记两个类方法,则只能在任何时刻执行其中一个方法(除非您调用wait
)。
另请注意,如果您有多个此类的实例,则可以同时执行不同实例的方法。