看了书上的这段话,有句话不理解,但我还是把三句话都打出来和大家分享加锁可以保证可见性于原子性;volatile变量只能保证可见性只有满足下面的标准后,你才能使用volatile变量:1.写入变量时并不依赖变量的当前值;或者能够确保只有单一的线程修改变量的值2.变量不需要与其他的状态变量共同参与不变约束。//这句不理解3.而且,访问变量时,没有其他的原因需要加锁。
我第二句不理解,首先,什么叫不变约束呢?

解决方案 »

  1.   

    http://blog.csdn.net/qking93415981/archive/2007/09/29/1806796.aspx
    楼主看看这个是否有用,楼主好运
      

  2.   

    volatile是弱同步级别,只是强制Thread每次读取变量都要去本地Main Memory里面刷新变量值而已“变量不需要与其他的状态变量共同参与不变约束”应该是指变量不会跟其他变量产生依赖关系,举个例子:
    int A;如果是volatile的,那么Thread-A和Thread-B每次去读A的值都必须去Main Memory里,所以会是一致的
    但如果A的定义是A=1+X;那么Thread-A和Thread-B每次去读A的值虽然都是去Main Memory里,但不能保证X的值是一致而且最新的
      

  3.   

    每个线程都可能拥有一个本地栈来维护一些变量的复本。
    如果把一个变量定义成volatile的,就等于告诉编译器对此变量不要做任何优化。
    这里所说的优化就是指:可能会移除那些使字段与线程里的本地数据复本保持完全同步的读写操作。我根据以上的观点来分析LZ的第二句:
    变量不用与本地数据复本保持同步。volatile关键字就是不让线程在本地栈保持这个变量的复本。
    所以线程看到的就一定是我们定义的这个唯一的变量了。
      

  4.   

    您只能在有限的一些情形下使用 volatile 变量替代锁。要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件: 对变量的写操作不依赖于当前值。 
    该变量没有包含在具有其他变量的不变式中。 
    我看到了上面这句话,有一点搞不懂
    为什么需要这个条件:“该变量没有包含在具有其他变量的不变式中”
    能否给我举例说明一下呢?