吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1876|回复: 9
收起左侧

[学习记录] java学习日记(第一天)(volatile关键字)

[复制链接]
三木猿 发表于 2020-9-17 15:32
从今天起每天发一篇java知识,由于本人是有基础的,所以内容可能不连贯,
如果想系统的学习java、请到这篇帖子
(重磅炸弹,原京东架构师编写)全套java学习笔记
https://www.52pojie.cn/thread-1260819-1-1.html
(出处: 吾爱破解论坛)
volatile :可见的,经常用来修饰共享变量,多线程中应用较多,意思是当共享变量内容被修改时,通知其他线程,这样其他线程就能知道他的值已经变化了。从浅到深,我们先来试试加了volatile和不加volatile的区别加了volatile--
[Java] 纯文本查看 复制代码
    public static  int i=0;

    public static void main(String[] args) {

        Thread thread = new Thread(() -> {
            sys();
        });
        Thread thread1 = new Thread(() -> {
            sys();
        });
        Thread thread2 = new Thread(() -> {
            sys();
        });
        thread.start();
        thread1.start();
        thread2.start();
    }
    public static void sys(){
        while(i<100){
            try {
                Thread.sleep(100);//模拟下卡顿
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            i++;
            System.out.println(Thread.currentThread().getName()+"-----"+i);
        }
    }
image.png 加了volatile之后,我们发现还是有重复值,然后又学到一个新的知识点1.i++不是一个原子操作,在多线程中不能保证一定执行-------具体:https://blog.csdn.net/huaweitman/article/details/383523452.volatile不能保证原子性,他提供了良好的可见性,就想i++如果没执行成功,值就没有变,其他线程也就还是用的原来的值,然后就出现一个值输出了两次,甚至更多.-----具体:https://blog.csdn.net/xdzhouxin/article/details/81236356 image.png 然后我们再深入了解一波,讲讲原理我们先回顾下基础知识。在多核CPU下,为了提高效率,线程都是直接到CPU缓存中拿值的,而不是内存。拿值时先到CPU缓存中找,没有再到内存中找,找到后拿到CPU缓存,再从缓存中拿出来,所以线程读操作始终在CPU缓存,这时就有个问题,CPU缓存中的值不一定和内存中的一样,所以在这里有个机制,内存会主动通知CPU缓存,告诉他当前共享变量的值已经失效了,从新再来拿一份。volatile关键字就是会触发这种机制,加了 volatile 关键字的变量,就会被识别成共享变量,内存中值被修改后,会通知到各个 CPU 缓存,使 CPU 缓存中的值也对应被修改,从而保证线程从CPU 缓存中拿取出来的值是最新的


以上就是所有内容,明天再见

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
15594998638 + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Vvvvvoid 发表于 2020-9-17 16:09
第一天 就学 这么偏僻的 关键字 volatile
 楼主| 三木猿 发表于 2020-9-17 16:30
Vvvvvoid 发表于 2020-9-17 16:09
第一天 就学 这么偏僻的 关键字 volatile

咱也是要进步的嘛,太简单的就懒得弄了
15594998638 发表于 2020-9-17 16:47
volitile只是保证了数据对其他线程实时可见,但是不能阻止其他线程对数据进行操作,所以要操作共享数据的话还是要加锁的
15594998638 发表于 2020-9-17 16:48
希望和楼主一样,每天进步
bakaest 发表于 2020-9-17 17:02
有基础的啊,还以为真的是第一天
 楼主| 三木猿 发表于 2020-9-17 17:11
bakaest 发表于 2020-9-17 17:02
有基础的啊,还以为真的是第一天

java从入门到劝退,可不是说着玩的,第一学开始我要写多久呀
小熊孩 发表于 2020-9-17 17:56
volatile 两个重要的特性
1:线程可见,
当你改变数据状态的时候,cpu会立即使用改变后的内容,使线程之间的共享变量进行同步
2.禁止指令重排
使cpu在这段程序内的命令禁止乱序执行

跟着楼主学习java的第一天
glossing 发表于 2020-9-30 09:04
跟着楼主学习java的第一天
allToBeNice 发表于 2021-4-20 09:30
刚好这两天学到了volatile这个关键字。
老哥讲的很棒~
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-29 20:39

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表