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

15 篇文章 0 订阅
7 篇文章 0 订阅

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


欢迎关注公众号:
公众号微信

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值