我是一个java菜鸟,所以请原谅我对这个主题的无知。 我在工作中被指示更新一些代码以使其线程安全。有人向我指出了需要更改的代码位。您可以在下面找到我的问题。
有一个抽象类,名为:AbstractServiceProcessor 在这个抽象类中,有一个对 getClass() 的调用,如下面的代码摘录所示:
finally
{
synchronized (getClass())
{
progressMeter.mark(item.getChangeList().size());
dsTimer.stop();
}
}
第一个问题:什么是 synchronized (getClass())
应该做什么?
第二个问题:我被指示将其更改为 synchronized (AbstractServiceProcessor.class)
那要做什么?为什么我被指示更改为这个?
预先感谢您的解释。
最佳答案
What is
synchronized(getClass())
supposed to do?
它获取 getClass()
返回的 Class
对象的锁。但是,您永远不应该使用它,正如已经指示的那样。问题是,synchronized
block 可能会锁定不同的 Class
对象,具体取决于调用该方法的子类对象。由于 getClass()
返回对象的运行时类型。因此,两个不同的线程(不应同时执行该 block )最终将执行该 block ,因为锁不同。这可能会导致您的应用程序出现严重错误。
I was instructed to change that to
synchronized(AbstractServiceProcessor.class)
. What is that going to do? Why was I instructed to change to this?
我已经解释了为什么您被指示进行此更改。现在,在 AbstractServiceProcessor.class
上进行同步可确保您始终锁定同一个 Class
对象,无论您在哪个子类对象上调用该方法。
关于java - 在抽象类定义中调用 getClass() 方法究竟会做什么——也与线程安全相关?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21992951/