zoukankan      html  css  js  c++  java
  • volatile关键字的介绍和使用

    关键字volatile的主要作用是使变量在过个线程中可见

    1、假设volatile不存在我们将会面对的问题

    public class PrintString implements Runnable
    {
    
        private boolean isContinuePrint = true;
    
        public boolean isContinuePrint() {
            return isContinuePrint;
        }
    
        public void setContinuePrint(boolean isContinuePrint) {
            this.isContinuePrint = isContinuePrint;
        }
    
        public void printStringMethod()
        {
            try
            {
                while(isContinuePrint)
                {
                    System.out.println("run printStringMethod threadName = " + Thread.currentThread().getName());
                    Thread.sleep(1000);
                }
            }
            catch(InterruptedException exception)
            {
                exception.printStackTrace();
            }
        }
    
        @Override
        public void run() {
            printStringMethod();
        }
    }
    public class Test {
    
        /**
         * @param args
         */
        public static void main(String[] args)
        {
            try
            {
                PrintString mPrintString = new PrintString();
                Thread mThread = new Thread(mPrintString);
                mThread.start();
                Thread.sleep(1000);
                mPrintString.setContinuePrint(false);//在-server模式下,这个操作修改的是公共堆栈中的值,而线程的私有堆栈并没有修改
            }
            catch(InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }

      当JVM 在-server模式下并不会停止PrintString的method,因为在-server的模式下存在一个公共堆栈和线程私有堆栈的概念。我们在调用setConinuePrinter(false)修改的是公共堆栈中的值,并不会影响到线程的私有堆栈。

      此时我们需要引入volatile关键字,作用是强制线程去公共堆栈中访问isContinuePrint的值。

      使用volatile关键字增加了实例变量在多个线程之间的可见性,但volatile关键字有一个致命的缺陷是不支持原子性

      synchronized与volatile关键字之间的比较

    • 关键字volatile是线程同步的轻量实现,所以volatile关键字性能比synchronized好。volatile只能修饰变量,synchronized可以修饰方法,代码块
    • volatile不会阻塞线程,synchronized会阻塞线程
    • volatile能保证数据的可见性,不保证原子性,synchronized可以保证原子性,可以间接保证可见性,它会将公共内存和私有内存的数据做同步处理。
    • volatile解决的是变量在多个线程之间的可见性,synchronized解决的是多个线程之间访问资源的同步性

      请记住Java的同步机制都是围绕两点:原子性,线程之间的可见性.只有满足了这两点才能称得上是同步的。Java中的synchronized和volatile两个关键字分别执行的是原子性和线程之间的可见性。

    volatile 并非原子性 

    来源:http://blog.csdn.net/a284266978/article/details/50866737

    参考:http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html

  • 相关阅读:
    找最后的字符
    统计指定数字和
    班级排队
    python编程题
    python函数题
    2019.6.24-2019.6.28(实训数据结构)3.数组编码求解问题
    2019.6.24-2019.6.28(实训数据结构)1.商品管理系统实训c++(实现的基本功能:初始化,创建表,插入,删除,更新,查询,链表数据与文件之间的转换)
    2019.6.24-2019.6.28(实训数据结构) 2.背包问题
    2019.6.24-2019.6.28(实训数据结构)4.树和二叉树应用项目
    2019.6.24-2019.6.28(实训数据结构)5.图的邻接矩阵表示
  • 原文地址:https://www.cnblogs.com/kongxc/p/8612679.html
Copyright © 2011-2022 走看看