史荣久

史荣久的微博

他的个人主页  他的微博

2011年03月03日 星期四 15:47 | 4条评论

评论

我的评论:

发表评论

请 登录 后发表评论。还没有在Zeuux哲思注册吗?现在 注册 !
徐敬琪

回复 徐敬琪  2011年03月03日 星期四 16:05

private volatile long currentScnd;
volatile long 这种写法通常是不对的
对于long或double类型,java语言不保证读或写一个变量是原子的。

3条回复

  • 史荣久

    回复 史荣久  2011年03月03日 星期四 16:28

    是的。有没改良的法。此处的volatile 仅做个标记吧。
    java.util.concurrent.atomic.AtomicLong
    也是这么写的
    private volatile long value;

    =====Java Concurrency in Practice======

    3.1.2. Nonatomic 64-bit Operations
    ........
    Out-of-thin-air safety applies to all variables, with one exception: 64-bit numeric variables (double and long) that are not declared volatile (see Section 3.1.4). The Java Memory Model requires fetch and store operations to be atomic, but for nonvolatile long and double variables, the JVM is permitted to treat a 64-bit read or write as two separate 32-bit operations. If the reads and writes occur in different threads, it is therefore possible to read a nonvolatile long and get back the high 32 bits of one value and the low 32 bits of another.[3] Thus, even if you don't care about stale values, it is not safe to use shared mutable long and double variables in multithreaded programs unless they are declared volatile or guarded by a lock.

    2条回复

      • 徐敬琪

        回复 徐敬琪  2011年03月03日 星期四 17:21

        volatile long 这种写法通常是不对的。
        > 恩,此说法有误。

        1条回复

          • 达伦王

            回复 达伦王  2011年03月03日 星期四 17:38

            AtomicLong里面之所以这么些是因为long初始值传入之后,所有的变更操作都是通过native的compareAndSet操作来完成, 而CAS本身是保证原子性的,而在AtomicLong里面给long加volatile纯粹是为了可见性
            这个是我的理解 :-)

            0条回复

暂时没有评论

Zeuux © 2024

京ICP备05028076号