前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java多线程学习(四)——volatile关键字

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

作者头像
小森啦啦啦
发布2019-07-15 15:53:58
3650
发布2019-07-15 15:53:58
举报
文章被收录于专栏:IT笔记分享IT笔记分享

volatile关键字

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

volatile与死循环

代码语言:javascript
复制
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);
    }
}
代码语言:javascript
复制
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
...

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

代码语言:javascript
复制
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);

    }
代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT笔记分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • volatile关键字
    • volatile与死循环
      • volatile关键字与synchronized比较
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档