对象的共享
2017-05-06 12:15 fengna 阅读(288) 评论(0) 编辑 收藏 举报1.volidate关键字:volidate关键字可以保证多线程程序使用共享且可变的long和double等类型的变量是安全的,非volidate类型则会不安全。
Java语言提供一种稍弱的同步机制,即volidate变量,用来确保将变量的更新操作通知到其他线程。在访问volidate变量时不会执行加锁操作,因此就不会使执行线程阻塞。
加锁机制既可以确保可见性又可以确保原子性,而volidate变量只能确保可见性。
2. 线程封闭:一种避免使用同步的方式就是不共享数据。如果仅在单线程内访问数据,就不需要同步。分为:栈封闭和ThreadLocal类
栈封闭:即线程内部使用或者线程局部使用,在栈封闭中,只能通过局部变量才能访问对象
ThreadLocal类:该类能使线程中的某个值与保存值的对象关联起来。
3. 安全发布对象的常用模式:要安全地发布一个对象,对象的引用以及引用的状态必须同时对其他线程可见。
(1)在静态初始化函数中初始化一个对象引用;
(2)将对象的引用保存到volidate类型的域或者AtomicReferance对象中;
(3)将对象的引用保存到某个正确构造对象的final类型域中;
(4)将对象的引用保存到一个由锁保护的域中。
4. 安全共享对象的策略:
(1)线程封闭。线程封闭的对象只能由一个线程拥有,对象被封闭在该线程内,并且只能由这个线程修改;
(2)只读共享。在没有额外同步的情况下,共享的只读对象可以由多个线程并发访问,但任何线程都不能修改它;
(3)线程安全共享。线程安全的对象在其内部实现同步,因此多个线程可以通过对象的公共接口来访问而不需要进一步的同步;
(4)保护对象。被保护的对象只能通过持有特定的锁来访问。保护对象包括封装在其他线程安全对象中的对象,以及已发布的并且由某个特定锁保护的对象。