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

标签 java spring synchronized

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

相关文章:

java - 无法解析方法,使用 JPA 数据的 Spring Boot 应用程序

java - 这是没有被破坏的双重检查锁定吗?

java - 同步块(synchronized block)

java - Spring Websocket Server 发送大量数据时重置连接

java - 为什么 settings.xml 布局与 ActionBar/Toolbar 重叠?

Verdana 字体按钮中的 Java 汉字

java - 使用 AspectJ 监控 Spring Boot 应用程序中 REST 调用的运行时间

java - 获取 "Attribute "ref“必须为元素类型 "property"声明。”

java - 为什么另一个线程在同步部分尚未完成时可以访问阻塞对象?

java - 无需数据库调用即可获取惰性 PersistentCollection