zoukankan      html  css  js  c++  java
  • volatile适用场景之二

     

    1.volatile最适用一个线程写,多个线程读的场合。

       如果有多个线程并发写操作,仍然需要使用锁或者线程安全的容器或者原子变量来代替。(摘自Netty权威指南)

       疑问:如果只是赋值的原子操作,是否可以多个线程写?(答案:可以,但是一般没有这样的必要,即没有这样的应用场景)

    最经典的使用案例:

    复制代码
    volatile boolean shutdownRequested;
    
    ...
    
    public void shutdown() { shutdownRequested = true; }
    
    public void doWork() { 
        while (!shutdownRequested) { 
            // do stuff
        }
    }
    复制代码

    使用场景2:

    结合使用 volatile 和 synchronized 实现 “开销较低的读-写锁”

    volatile 允许多个线程执行读操作,因此当使用 volatile 保证读代码路径时,要比使用锁执行全部代码路径获得更高的共享度 —— 就像读-写操作一样。

    复制代码
    public class CheesyCounter {
    
        private volatile int value;
    
        public int getValue() { return value; }
    
        public synchronized int increment() {
            return value++;
        }
    }
    复制代码

    或者

       private volatile long start = System.currentTimeMillis();
       public synchronized long get() {
            return start++;
        }

    正确使用 volatile 变量的条件

    您只能在有限的一些情形下使用 volatile 变量替代锁。要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件:

    • 对变量的写操作不依赖于当前值。
    • 该变量没有包含在具有其他变量的不变式中。

    更多使用场景可参考:

    http://www.ibm.com/developerworks/cn/java/j-jtp06197.html

  • 相关阅读:
    手把手教你如何安装Pycharm
    虚拟机的安装
    将BUG管理工具(禅道)部署到服务器(测试服务器、云服务器)
    XMind入门教程
    测试流程中的问题
    MySQL安装
    SDK?JDK?JDK 下载、安装、配置图文教程
    tomcat是什么?Tomcat 下载、安装、配置图文教程
    转:如何准备性能测试数据
    转:性能测试用例设计策略
  • 原文地址:https://www.cnblogs.com/shoshana-kong/p/10562433.html
Copyright © 2011-2022 走看看