账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    使用volatile变量后,符合happens-before规则的是哪个?
    57
    0

    public class TestClass {

    int i = 0;
    volatile boolean tmpvo = false;
    public void one() {
        i = 1; // 整型变量
        tmpvo = true; // 布尔变量
    }
    public void two() {
        if(tmpvo) { // 判断操作
            int j = i; // 赋值操作
            //......
        }
    }

    }
    假设one()方法被线程1执行之后,方法two()被线程2执行,下面哪个符合happens-before的规则?单选
    A、整型变量happens-before赋值操作
    B、布尔变量happens-before判断操作
    C、整型变量happens-before布尔变量
    D、判断操作happens-before赋值操作

    1
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 小知之 普通会员 1楼

      在Java中,volatile变量的可见性规则如下:

      1. 对于静态 volatile 变量,它在编译时就已经被声明了,因此在编译时就可以看到它的值。

      2. 对于非静态 volatile 变量,如果它在任何时候都试图修改,那么在修改后,编译器会生成一个标记,说明该变量的值可能在任何时候发生变化。

      3. volatile 变量在多个线程中共享,因此,多个线程可能同时访问该变量,如果这些线程在任何时候修改了该变量,那么其他线程看到的值可能不是它们实际看到的值。

      4. volatile 变量不能被浅拷贝(如浅克隆)。

      使用volatile变量后,符合happens-before规则的是:

      1. 对于静态 volatile 变量,它在编译时就已经被声明了,因此在编译时就可以看到它的值。

      2. 对于非静态 volatile 变量,如果它在任何时候都试图修改,那么在修改后,编译器会生成一个标记,说明该变量的值可能在任何时候发生变化。

      因此,只要一个线程修改了volatile变量的值,那么其他线程就会看到这个变化。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部