问题1)根据我的理解,spring会创建单例对象,所以当我有一个像下面这样的自动装配服务器时,会影响线程安全。
问题2)如果我在类级别声明一个int类型变量并在控制器或服务中使用它,它会影响线程安全吗?
@Controller
public class LoginController {
@Autowired
public DaoService daoservice;
@RequestMapping("/")
public String getBookInfo() {
Book book = daoservice.getBookbyId(1L);
System.out.println(book.getTitle());
return "welcome";
}
}
@Service
public class DaoService {
@Autowired
public BookRepository BookRepo;
public Book getBookbyId(Long Id) {
Book book = BookRepo.findOne(Id);
return book;
}
}
答案 0 :(得分:3)
问题1:Spring Beans线程安全吗?
答案:不。
Spring不会为你的bean提供线程安全。 Spring提供不同类型的bean范围,如(Prototype,Singleton等)。如果是 Prototype ,则每次调用新的bean时都会创建一个新的bean,其中 singleton bean创建一次并在application context
中共享。
如果您正在考虑HTTP
请求,那么可能会有2个或更多请求。在每个请求范围中创建一个bean的新实例。因此,您可以认为它们在HTTP
请求的上下文中是线程安全的,但它本身并不是Spring本身的线程安全。因为几个线程可以在同一HTTP
请求上下文中共享bean。
问题2:类变量线程安全吗?
答案:否
引自here
所有私有成员变量都是共享的。它们可能是最终的,但这只意味着引用无法更改。任何可变状态都必须同步。