Java 如何使所有类方法仅在单个线程上运行?(同步类?)
我知道Java 如何使所有类方法仅在单个线程上运行?(同步类?),java,multithreading,sqlite,jdbc,synchronized,Java,Multithreading,Sqlite,Jdbc,Synchronized,我知道synchronized关键字使方法一次只能在单个类上运行。但问题是 我有一个带有方法的数据库类,例如,insertAccount,updateset,等等。如果我使insertAccount,updateset同步,那么每次只能在一个线程上运行 若有一种方法可以用于整个数据库,那个就太好了,但并没有一种方法。如果一个线程调用insertAccount,而另一个线程同时调用updateSetting,那么它会坏掉,对吗 因为任何时候都只能运行其中一个方法。那我该怎么办 有没有一种方法可以将
synchronized
关键字使方法一次只能在单个类上运行。但问题是
我有一个带有方法的数据库类,例如,insertAccount
,updateset
,等等。如果我使insertAccount
,updateset
同步,那么每次只能在一个线程上运行
若有一种方法可以用于整个数据库,那个就太好了,但并没有一种方法。如果一个线程调用insertAccount
,而另一个线程同时调用updateSetting
,那么它会坏掉,对吗
因为任何时候都只能运行其中一个方法。那我该怎么办
有没有一种方法可以将类似于
synchronized
的东西应用于整个班级?因此,如果第一个线程同时调用insertAccount
和第二个线程调用updateset
,那么第二个线程必须等到第一个线程完成对数据库的访问。您误解了同步的工作方式
如果通过synchronized
标记类的两个方法,则在任何时刻都只能执行其中一个(除非调用wait
)
还要注意的是,如果这个类有多个实例,那么可以同时执行不同实例的方法。这里真正的答案是:后退一步,做一些研究。您不应该在这里使用synchronized,而是查看一个锁对象,读写器在转到该“DB类”之前需要获取该对象。有关更多信息,请参阅
另一方面,您应该了解什么是事务,以及数据库如何支持这些事务。意思是:有各种各样的问题;不同的层(应用程序代码、数据库)有不同的职责
你看,使用“试错法”在这里是行不通的。你应该花些时间认真研究基本概念。否则,您可能会损坏您的数据集;更糟糕的是:你冒着编写大部分时间都能正常工作的代码的风险;但以模糊的方式“随机”失败。因为当多个线程以不受控制的方式操作共享数据时,就会发生这种情况。您应该使用锁定机制,这样的信号量您应该依赖(正确使用)具有适当事务隔离级别的数据库事务,如果您有多个节点托管(web)应用程序,它甚至可以工作(假设它们使用相同的数据库).看一看:谢谢,嗯,你是说它不会坏吗?我只有一个数据库类实例。你确定我不需要任何锁定机制吗?是的。它足以在所有访问或修改对象状态的方法上放置synchronized
。这不是最好的方法,但它是最简单的方法。一般来说,只要坚持synchronized
在没有考虑或思考的情况下,做任何事情都不会让它神奇地安全穿行或“正确”行事。@markrottveel是的,在corse。做任何“没有考虑或思考”的事情都不会带来任何好处。