【问题标题】:How to make all class methods run only on single thread? (synchronized class?)如何让所有类方法只在单线程上运行? (同步类?)
【发布时间】:2017-12-22 00:35:49
【问题描述】:

我知道synchronized 关键字使方法一次只能在一个类上运行。但问题就在这里。

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

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

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

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

【问题讨论】:

  • 你应该使用锁定机制,比如信号量
  • 您应该依赖(正确使用)具有适当事务隔离级别的数据库事务,然后如果您有多个节点托管(Web)应用程序,它甚至可以工作(假设它们确实使用相同的数据库)。

标签: java multithreading sqlite jdbc synchronized


【解决方案1】:

真正的答案在这里:退后一步,做一些研究。您不应该在这里使用 synchronized,而应该查看一个 lock 对象,读取器/写入器需要在 prior 转向那个“DB班级”。请参阅here 了解更多信息。

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

您知道,使用“试错法”并不是一种可行的方法。您应该花一些认真时间研究基本概念。否则,您将面临损坏数据集的风险;更糟糕的是:你冒着编写大部分时间都能正常工作的代码的风险;但以模糊的方式“随机”失败。因为当多个线程以不受控制的方式操作共享数据时,就会发生这种情况。

【讨论】:

    【解决方案2】:

    您误解了synchronized 的工作原理。

    如果您用synchronized 标记了两个类方法,则在任何时候都只能执行其中一个(除非您调用wait)。

    还要注意,如果你有这个类的多个实例,你可以同时执行不同实例的方法。

    【讨论】:

    • 谢谢,嗯,所以你是说它不会坏?我只有 1 个数据库类实例。你确定我不需要任何锁定机制?
    • 是的。将synchronized 放在所有访问或修改对象状态的方法上就足够了。这不是最好的方法,但它是最简单的方法。
    • 一般来说,只是将synchronized 粘贴在不加考虑或思考的事物上不会使其具有神奇的线程安全性或“正确”行为。
    • @MarkRotteveel 是的。做任何“不加考虑或思考”的事情永远不会带来任何好处。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多