1.线程安全安全
线程安全封装在共享数据内部多线程
共享数据 有状态值 不在线程栈 加锁 并发
单个状态值 现有线程安全类 ,多个状态值 不变性条件涉及的状态值 用同一把锁less
2对象的共享性能
发布: 对象的引用传给做用域外。 方法参数 返回值,静态变量this
逸出:不该该发布的对象被发布了。构造方法中建立内部类实例,启动线程,拥有不完整this。prototype
安全发布:线程
①线程封闭: 局部变量(线程栈中) threadlocal对象
②volatile(可见性) + 不可变类 : 想改变只能从新建立对象,并保证可见性作用域
③线程安全共享: 线程内部实现同步
④保护对象:加锁
第三:Spring中的有状态(Stateful)和无状态(Stateless)
1.经过上面的分析,相信你们已经对有状态和无状态有了必定的理解。无状态的Bean适合用不变模式,技术就是单例模式,这样能够共享实例,提升性能。有状态的Bean,多线程环境下不安全,那么适合用Prototype原型模式。Prototype: 每次对bean的请求都会建立一个新的bean实例。
2.默认状况下,从Spring bean工厂所取得的实例为singleton(scope属性为singleton),容器只存在一个共享的bean实例。
3.理解了二者的关系,那么scope选择的原则就很容易了:有状态的bean都使用prototype做用域,而对无状态的bean则应该使用singleton做用域。
4.如Service层、Dao层用默认singleton就行,虽然Service类也有dao这样的属性,但dao这些类都是没有状态信息的,也就是至关于不变(immutable)类,因此不影响。Struts2中的Action由于会有User、BizEntity这样的实例对象,是有状态信息的,在多线程环境下是不安全的,因此Struts2默认的实现是Prototype模式。在Spring中,Struts2的Action中,scope要配成prototype做用域。
同步容器 fail-fast 容器改变 抛出异常 有些操做须要加锁
并发容器 弱一致性 不抛出异常 并发访问 效率高
通常用concurrenthashmap ,分段锁, 并发读写不一样的段,,须要独占访问 用 hashmap, synchronizedmap
copyonwritelist 写入时复制 ,新建一个容器, 适合遍历多的状况,例如观察者模式遍历通知