如何让所有的类方法只在单线程上运行? (同步课?)

问题描述:

我知道​​关键字使方法一次只能在单个类上运行。但这是问题。如何让所有的类方法只在单线程上运行? (同步课?)

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

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

因为只有其中一种方法可以随时运行。那么我该怎么做?

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

+0

您应该使用锁定机制,例如信号量 –

+1

您应该依赖(正确使用)具有适当事务隔离级别的数据库事务,如果您拥有多个承载(Web)应用程序的节点,它甚至可以工作(假设他们使用相同的数据库)。 –

+0

看看:https://*.com/questions/442564/avoid-synchronizedthis-in-java?rq=1 –

你误解​​是如何工作的。

如果您通过​​标记了两个类的方法,则只有其中一个方法可以在任何时刻执行(除非调用wait)。

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

+0

谢谢,嗯,所以你说它不会中断?我只有1个数据库类的实例。你确定我不需要任何锁定机制? –

+1

是的。在所有访问或修改对象状态的方法上加入'synchronized'就足够了。这不是最好的方法,但它是最简单的方法。 – talex

+2

一般而言,只要将“同步”放在事物上而不考虑或不考虑,就不会使其神奇地线程安全或行为“正确”。 –

The real回答这里:退后一步,做一些学习。您不应该在这里使用同步的,而是查看读写器需要获取的对象之前转向该“DB类”。有关更多信息,请参阅here

另一方面,您应该了解交易是什么,以及您的数据库如何支持这些。含义:存在不同类型的问题;和不同的层(应用程序代码,数据库)有不同的职责责任

你看,使用“试错法”并不是一种可以在这里实现的方法。你应该花一些时间研究潜在的概念严重。否则,你冒着损坏你的数据集的风险;更糟糕的是:你有冒险编写大部分时间都能正常工作的代码;但以“随意”的模糊方式失败。因为这是多线程以不受控制的方式操作共享数据时发生的情况。