随笔都是学习笔记
随笔仅供参考,为避免笔记中可能出现的错误误导他人,请勿转载。
posts - 398,comments - 0,views - 13万

作用:

volatile关键是主要是定义在属性上,表示此属性直接为数据操作,不做副本拷贝的处理。

正常的变量处理步骤:

  - 获取变量原有的数据内容副本;

  - 利用副本为变量进行数学计算;

  - 将计算后的变量,保存到原始空间之中。

而如果一个属性上追加了volatile关键字表示:

  不适用副本,直接操作原始变量

  节约了拷贝副本、重新保存的步骤

 在属性上加了volatile表示在数据上直接进行操作,不做副本的操作

但是这并不能解决同步的问题,所以当遇到同步的问题的时候还是得用同步相关的解决方法。

volatile加同步代码测试:

复制代码
package Demo_2_2_volatile关键字;

public class MyThread implements Runnable {
    private volatile int ticket = 5;

    @Override
    public void run() {
        synchronized (this) {
            while (this.ticket > 0) {
                try {
                    Thread.sleep(10);  // 睡眠
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "买票,ticket剩余: " + --this.ticket);
            }
        }
    }
}
复制代码

 

复制代码
package Demo_2_2_volatile关键字;

public class Main {
    public static void main(String[] args) {
        MyThread mt = new MyThread();
        new Thread(mt,"黄牛1").start();
        new Thread(mt,"黄牛2").start();
        new Thread(mt,"黄牛3").start();
    }
}
复制代码

输出结果:

 

面试题:

请解释volatile 与 synchronized的区别?。
  - volatile主要在属性上使用,而synchronized是在代码块与方法上使用的;

  - volatile无法描述同步的处理,它只是一种直接内存的处理,避免了副本的操作,而synchronized是实现同步的操作。

 

posted on   时间完全不够用啊  阅读(99)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示