Java多线程编程06 -volatile&synchronized比较 &可见性&原子性

本文探讨了Java中volatile和synchronized的关键区别。volatile保证了多线程间的变量可见性,但不保证原子性,而synchronized则提供了原子性和可见性,但可能导致线程阻塞。文章通过实例解释了volatile解决的可见性问题,以及synchronized如何实现线程同步。同时,介绍了Java内存模型(JMM)在保证内存可见性和原子性方面的作用。
摘要由CSDN通过智能技术生成

-volatile

volatile 主要作用是是变量在多个线程间可见。

  • 一个同步死循环的问题
    主要形式例如:main调用一个方法print(),这个方法根据一个boolean 值判断是不是结束循环,但是这个初始的boolean值是true的,也就是会在方法里一直循环,而把这个值置为false的语句在mian里调用print()的下面,也就是说单线程模式下,main执行不到调用print()下面的语句。
    解决办法:新开一个线程去执行print(),新线程和main线程是异步的,也就是说即使新线程在print里暂时死循环了,main下面把boolean置为false的语句还是可以执行的,那下一次时间片轮到新线程的时候,它一看,诶! boolean值变成false了,果断退出循环了。

但是,上面的代码运行在-server服务器的64bit的JVM上时,会出现死循环,解决办法就是volatile. 关键字volatile的作用就是强制从公共栈里面取得变量的值,而不是从线程私有数据栈中取得变量的值。
看下面例子:

public class RunThread extends Thread {
   

    private boolean isRuning=true;

    public boolean isRuning() {
   
        return isRuning;
    }

    public void setRuning(boolean runing) {
   
        isRuning = runing;
    }

    @Override
    public void run() {
   
        System.out.println("进入run了");
        while (isRuning==true){
   
        }
        System.out.println("线程被停止了!");
    }
}

public class Run {
   
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值