专栏首页IT笔记分享Java多线程学习(四)——volatile关键字

Java多线程学习(四)——volatile关键字

volatile关键字

当用volatile关键字声明变量的时候,就等于告诉虚拟机,这个变量极有可能被某些程序或者线程修改,为了保证比那辆被修改后应用程序范围内的所有线程可以看到这个改动,虚拟机必须采用一些方法保证这个变量的可见性。

volatile与死循环

public class PrintString {
    private boolean isContinue = true;

    public boolean isContinue() {
        return isContinue;
    }

    public void setContinue(boolean aContinue) {
        this.isContinue = aContinue;
    }

    public void printStringFunc(){
        try {
            while (isContinue){
                System.out.println("run printStringFunc threadName=" + Thread.currentThread().getName());
                Thread.sleep(1000);
            }
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }

    public static void main(String[] args){
        PrintString printString = new PrintString();
        printString.printStringFunc();
        System.out.println("stop printStringFunc stopThread=" + Thread.currentThread().getName());
        printString.setContinue(false);
    }
}
run printStringFunc threadName=main
run printStringFunc threadName=main
run printStringFunc threadName=main
run printStringFunc threadName=main
run printStringFunc threadName=main
run printStringFunc threadName=main
run printStringFunc threadName=main
run printStringFunc threadName=main
...

上面的代码执行后会一直运行无法停下来,下面来看看解决方法。

public class PringStringThread {    private boolean isContinue = true;    public boolean isContinue() {        return isContinue;
    }    public void setContinue(boolean aContinue) {        this.isContinue = aContinue;
    }    public void printStringFunc(){        try {            while (isContinue){
                System.out.println("run printStringFunc threadName=" + Thread.currentThread().getName());
                Thread.sleep(1000);
            }
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }

}public static void main(String[] args){

        PringStringThread pringStringThread = new PringStringThread();        new Thread(() -> pringStringThread.printStringFunc()).start();        try {
            Thread.sleep(2000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        pringStringThread.setContinue(false);

    }
run printStringFunc threadName=Thread-0
run printStringFunc threadName=Thread-0

Process finished with exit code 0

可以发现线程退出循环了。

volatile关键字与synchronized比较

  1. volatile关键字是线程同步的轻量级实现,所以volatile性能肯定比synchronized关键字要好。但是volatile关键字只能用于变量而synchronized关键字可以修饰方法以及代码块。synchronized关键字在jdk6之后进行了主要包括为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁以及其它各种优化之后执行效率有了显著提升,实际开发中使用synchronized关键字还是更多一些。
  2. 多线程访问volatile关键字不会发生阻塞,而synchronized关键字可能会发生阻塞。
  3. volatile关键字能保证数据的可见性,但不能保证数据的原子性。synchronized关键字两者都能保证。
  4. volatile关键字用于解决变量在多个线程之间的可见性,而synchronized关键字解决的是多个线程之间访问资源的同步性。

本节代码Github

本文分享自微信公众号 - IT笔记分享(xiaosen_javashare),作者:xiaosen L

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • spring boot使用@Async异步任务

    返回值,若想获取到返回值,应该轮询方法获取,否则若果没有isDone则不会走下面的方法,或者可以使用CompletableFuture:

    小森啦啦啦
  • java虚拟机笔记(三)

    类从被加载到虚拟机内存开始到卸载内存为止,整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载

    小森啦啦啦
  • Java多线程学习(六)——Lock的使用

    锁是用于通过多个线程控制对共享资源的访问的工具。通常,锁提供对共享资源的独占访问:一次只能有一个线程可以获取锁,并且对共享资源的所有访问都要求首...

    小森啦啦啦
  • 编程,听歌,找图片,看电影,找资源,一个网站可以让你减少10个软件的安装

    Rookie
  • 开源任务管理平台TaskManager介绍

      很早之前准备写Quartz系列文章,现在终于能够实现了。从本篇开始将带你实现一款自己的任务管理平台。在工作中你曾经需要应用执行一个任务吗?这个任务每天或每周...

    用户1168362
  • 2019版CCF推荐国际学术会议和期刊目录发布!AI领域七大A类会议,你认同吗?

    近日,中国计算机学会 (CCF) 正式发布《中国计算机学会推荐国际学术会议和期刊目录》(下文简称 “目录”)。

    新智元
  • 编程,听歌,找图片,看电影,找资源,一个网站可以让你减少10个软件的安装

    Rookie
  • Android native进程间通信实例-binder篇之——HAL层访问JAVA层的服务

    有一天在群里聊天的时候,有人提出一个问题,怎样才能做到HAL层访问JAVA层的接口?刚好我不会,所以做了一点研究。

    啊源股
  • 解决eclipse spring配置报错:cvc-elt.1: Cannot find the declaration of element

    解决eclipse spring配置报错:cvc-elt.1: Cannot find the declaration of element 'beans'. ...

    2Simple
  • k8s集群网络(3)-宿主内网络例子

    在上一篇文章中我们介绍了linux network namespace,linux bridge device,linux veth device,以及dock...

    TA码字

扫码关注云+社区

领取腾讯云代金券