我正在运行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 变量值的值对于其他线程还是所有线程仅写入其本地副本?
答案 0 :(得分:0)
如果您使用默认的Spring行为,则这些类不是线程安全的。缺省情况下,Spring Bean是单例实例,这些实例将注入整个应用程序。路由到您控制器的所有请求都将转到该单个实例。
是的,它们将对其他线程可见,但不能保证实际值是准确的。无法保证其原子性。考虑同步对该变量的写访问(在某些情况下会降低性能),或者如果该值是“只读”则使其易变。
您可能还想考虑使用AtomicInteger