1.有状态的与无状态的bean
- 有状态就是有数据存储功能。 有状态对象(Stateful Bean),就是有实例变量的对象 ,可以保存数据,是非线程安全的。
- 无状态就是一次操作不能保存数据。 无状态对象(Stateless Bean),就是没有实例变量的对象 ,不能保存数据是不变类,是线程安全的。
无状态bean | singleton单例模式 | 共享实例,提高性能 |
---|---|---|
有状态bean | prototype原型模式 | 对每次bean请求都创建一个新的bean实例 |
2. Spring中的单例
- 设计模式的单例是在整个应用中只有一个实例,而Spring中的单例是在一个IOC容器中就只有一个实例。
3. Spring使用ThreadLocal解决线程安全问题案例
ThreadLocal:
- 每个线程中都有一个自己的ThreadLocalMap类对象,可以将线程自己的对象保持到其中,各管各的,线程可以正确的访问到自己的对象。
- 将一个共用的ThreadLocal静态实例作为key,将不同对象的引用保存到不同线程的ThreadLocalMap中,然后在线程执行的各处通过这个静态ThreadLocal实例的get()方法取得自己线程保存的那个对象,避免了将这个对象作为参数传递的麻烦。
4. ThreadLocal与线程同步机制的比较
-
在同步机制中,通过对象的锁机制保证同一时间只有一个线程访问变量。这时该变量是多个线程共享的,使用同步机制要求程序慎密地分析什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放对象锁等繁杂的问题,程序设计和编写难度相对较大。
-
ThreadLocal通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题。