标签:不可变对象 如何 from get 传递 value final 可见 jdbc
Volatile 关键字的作用:
long
和 double
的读取或者赋值的原子性Volatile 的主要用法:
long
和 double
类型的原子性发布: 一个对象能够被当前范围外的代码所使用. 比如:
逸出: 一个对象还没有准备好, 就被发布. 比如:
collection.add(this)
, this
就被逸出了.Note: 不要在构造函数中 启动 一个线程. 因为当对象在构造函数中创建了一个线程, 无论是显式的还是隐式的, this
引用几乎总是被新线程共享. 构造函数中可以创建一个线程, 但是 不要启动 它!
线程需要同步的原因是: 线程之间要共享数据. 所以避免同步的方式就是 不共享数据, 也叫 线程封闭.
应用池的 JDBC 对象是一个线程封闭的例子, 每个 Connection 对象在归还到池中以前, 总是被某个线程独占的.
特点: 容易出错, 应该用 栈限制 和 ThreadLocal 取代.
本地变量被限制在执行线程里, 他们存在于 执行线程栈, 其他线程无法方位这个栈.
Note: 确保本地变量不要被逸出!
ThreadLocal
可以将多个对象绑定在执行线程中, ThreadLocal
提供了 get
和 set
方法, 为每个使用它的线程维护一份单独的拷贝.
ThreadLocal
常用在:
SimpleDateFormatter
和 Connection
ThreadLocal: Every thread has a threadLocals map structure to store value related on the thread.
When calling ThreadLocal.get():
ThreadLocal firstly try to get the threadLocals map structure:
if the map is not null, then try to get value from the map
发布对象依赖于对象的可变性:
不可变对象是那些构造后状态无法被改变的对象. 由于它的不可变性, 他不会有 Thread interference
和 Memory inconsistent
等问题.
不可变对象的特征:
setter
方法.final
+ private
final
如果实例变量中有引用类型, 别让他们被更改:
不要共享他们的引用, 包括
不可变对象永远是线程安全的. 它只有一种状态, 无法被更改. 不可变对象有如下特征:
this
引用逸出)final
类型NOTE: 如果 final
域指向可变对象, 那么访问这些对象的状态时仍然需要同步.
如何保证一个 不可变对象 的可见性?
volatile
域或者 AtomicReference
final
域中 一个对象在技术上不是不可变的, 但是它的状态不会在发布后被修改, 这样的对象称作有效不可变对象.
任何线程都可以在没有额外的同步下安全地使用一个安全发布的高效不可变对象.
安全发布仅仅可以保证"发布当时"状态的可见性. 但是之后状态的改变需要线程同步来保证.
标签:不可变对象 如何 from get 传递 value final 可见 jdbc
原文地址:http://www.cnblogs.com/pragmatic/p/6181612.html