首页 > 解决方案 > Spring控制器序列化同步

问题描述

假设我有一个这样的 Spring 控制器

@RestConroller
class MyController {

    MyObject myObject;

    @GetMapping
    synchronized MyObject get() {
        return myObject;
    }

    // Runs in another thread
    void f() {
        for (;;) {
            synchronized {
                myObject.modify();
            }
        }
    }
}

在我看来,将 myObject 序列化为 JSON 和 f 的 Spring 代码将在 get() 返回时同时尝试访问 myObject。除了返回 myObject 的深层副本之外,还有其他方法可以防止这种情况吗?

标签: javaspringmultithreadingspring-boot

解决方案


在同步块中使用 myobject 属性

Synchronized(myobject) {} 或者您可以使用任何其他并发锁。此外,如果您想要深拷贝,您可以通过对象序列化或 json 序列化来序列化和反序列化 myobject。

也许您可以检查方法同步或块同步。https://www.google.com/amp/s/www.geeksforgeeks.org/method-block-synchronization-java/amp/


推荐阅读