如果线程A将对象X置入某个线程安全器,随后线程B重新获得X,这时可以保证B看到的X的状态,一定正是A设置的。
为了安全的发布对象,对象的引用以及对象的状态必须同时对其他线程可见。
1、通过静态初始化器初始化对象的引用;
2、将它的引用存储到volatile域活AtomicReference;
3、将它的引用存储到正确创建的对象的final域中;
4、将它的引用存储到由锁正确保护的域中。
以下情况符合安全发布:
1、置入Hashtable、synchronizedMap、ConcurrentMap中的主键以及键值,会安全地发布到可以从Map获得它们的任意线程中,无论是直接获得还是通过迭代器(iterator)获得;
2、置入Vector、CopyOnWriteArrayList、CopyOnWriteArraySet、synchronizedList或者synchronizedSet中的元素,会安全地发布到可以从容器中获得它的任意线程中;
3、置入BlockingQueue或者ConcurrentLinkedQueue的元素,会安全地发布到可以从队列中获得它的任意线程中。
任何线程都可以在没有额外的同步下安全地使用一个安全发布的高效不可变对象。
比如,Date自身是可变的,但是如果你把它当作不可变对象来使用就可以忽略锁。否则,每当Date被跨域线程共享时,都要用锁确保安全。
假设你正在维护一个Map,它存储了每位用户的最近登录时间:
public MaplastLogin = Collections.synchronizedMap(new HashMap ());