gpt4 book ai didi

java - 在抽象类定义中调用 getClass() 方法究竟会做什么——也与线程安全相关?

转载 作者:行者123 更新时间:2023-12-02 06:09:44 26 4
gpt4 key购买 nike

我是一个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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com