Java中的线程之间共享原始类型吗?

时间:2020-09-28 18:27:31

标签: java spring spring-boot

我正在运行SpringBoot 2.0 Webapp,我的控制器按如下方式调用我的单例类:

@RestController
public class MyCallerClass{

    private int count=0;

    @PutMapping(/test)
    incrementCount()
    {
         increaseCount()
    }

}

如果我有一个像下面这样的单例课程

@Component
public class MyClass{

    private int count=0;

    @async
    increaseCount()
    {
        count++;
    }

}

我的第一个疑问是RestController本身是否将是多线程的,即是否存在控制器的多个实例来分担负载,或者所有调用都只能路由到rest控制器的一个实例?

第二,由于controller将以异步方式(将其标记为async)调用gainCount()方法,因此一个线程写入 primitive 变量值的值对于其他线程还是所有线程仅写入其本地副本?

1 个答案:

答案 0 :(得分:0)

如果您使用默认的Spring行为,则这些类不是线程安全的。缺省情况下,Spring Bean是单例实例,这些实例将注入整个应用程序。路由到您控制器的所有请求都将转到该单个实例。

是的,它们将对其他线程可见,但不能保证实际值是准确的。无法保证其原子性。考虑同步对该变量的写访问(在某些情况下会降低性能),或者如果该值是“只读”则使其易变。

您可能还想考虑使用AtomicInteger