Java并发3.1-可见性-续

1.疑问。对于程序清单3.3,仅仅同步setter是不够的,调用get线程仍然能够看见过期值。(为什么?)(是不是因为同一个对象,两个sychronized块拥有同一个锁,就使的value读同步)

2.最低限的安全性。当一个线程在没有同步的情况下读取变量,它可能会得到一个过期值。但是它至少可以看到某个线程在那里设定的一个真实数值,而不是凭空而来的。

3.非volatilelongdouble变量。对于非volatilelongdouble变量,jvm允许将64位的读写划分为232位的操作。如果读和写发生在不同线程,读取一个非volatilelongdouble变量可能出现一个值的高32位和另一个值的低32位。故,在多线程中使用共享的、可变的非volatilelongdouble变量也可能是不安全的。除非将它们声明为volatile类型或者锁保护。

4.锁和可见性。内置锁可以用来确保一个线程以某种可以预见的方式看到另一个线程的影响。

锁不仅仅是关于同步和互斥的,也是关于内存可见的。为了保证所有线程都能够看到共享的、可变变量的最新值,读取和写入线程必须使用公共的锁进行保护。

5.volatile变量。Java提供了另一种同步的弱形式:volatile变量。它确保变量的更新以可以预见的方式告知其他线程。(即:读取一个volatile类型的变量时,总会返回由某个线程写入的最新值)

6.Volatile是轻量级的同步机制:访问volatile变量的操作不会加锁,也不会引起线程执行阻塞。

7.不推荐建议。依赖volatile变量控制可见性,并不推荐,比使用锁的代码更脆弱,更难理解。

8.法则:只有当volatile变量能够简化实现和同步策略的验证时,才使用它们。当验证正确性必须要推断可见性问题时,应该避免使用volatile变量。正确使用volatile变量的方式包括:用于确保它们所引用的对象状态的可见性,或者用于标识重要的生命周期(如初始化或关闭)发生。

9.检查状态标记。程序清单3.4示范了volatile的典型应用。

10.Volatile的限制。

法则:加锁可以保证可见性与原子性;volatile变量只能保证可见性。

11.使用volatile的法则:(且的关系)

   1)写入变量时,并不依赖变量的当前值;

   2)变量不需要与其他的状态变量共同参与不变约束;

   3)访问变量时,没有其他原因需要加锁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值