Java中的volatile例子

public class StudyWhileLoopMain {
    private volatile static int tag = 0;
    public static void main(String[] args) {
        System.out.println("主函数开始执行");
        MyThread myThread = new MyThread();
        myThread.start();
        System.out.println("线程已经开始");
        /** tag如果不加volatile修复则一直不结束 */
        while (tag == 0);
        System.out.println("标记通过");
    }

    protected static class MyThread extends java.lang.Thread {
        @Override
        public void run() {
            super.run();
            System.out.println("线程开始");
            try {
                Thread.sleep(9000);
            } catch (java.lang.InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程赋值标记为1");
            tag = 1;
        }
    }
}
`volatile` 是 Java 中的一个关键字,主要用于线程之间的可见性控制。当我们希望某个变量的状态修改能够立即对其他线程可见时,可以将该变量声明为 `volatile`。 ### 使用场景及作用 1. **保证内存可见性** 当一个线程修改了 `volatile` 变量的值时,新值会立刻被更新到主存中,并且其他线程读取这个变量时也能从主存获取最新的值,而不是缓存在本地 CPU 的副本上。 2. **防止指令重排序** JVM 为了优化性能可能会对程序中的操作进行指令重排,而通过使用 `volatile` 关键字修饰变量,则能禁止对其相关的某些操作进行重排序,从而避免潜在的数据竞争问题。 3. **不具备原子性** 需要注意的是,虽然 volatile 能够提供变量状态改变后的即时通知功能以及一定程度上的顺序保障,但它并不能替代锁机制 (synchronized 或 Lock),因为它无法保证复合动作如 i++ 这样的操作具有原子性。 4. **典型应用场景** - 状态标志位:用于指示某种条件是否成立。 - 单例模式延迟加载实例化等需要考虑多线程环境下共享数据一致性的场合。 ```java public class VolatileExample { private static volatile boolean flag = true; public static void main(String[] args) throws InterruptedException { new Thread(() -> { while(flag){ // Do something... } System.out.println("Thread stopped."); }).start(); Thread.sleep(500); // Simulate delay for starting another thread. new Thread(() -> { try{ Thread.sleep(200); } catch(Exception e){} flag=false; }).start(); } } ``` 在这个例子中,“flag”被设定了volatile属性后,在第二个线程将其设置成false之后,第一个线程就可以感知到这种变化并终止循环运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值