volatile关键字解析

volatile关键字能够保证对其修饰的变量进行 读取 或 写入 操作时是原子操作,且保证对其修饰的变量进行写入操作是具有先行发生原则的(即对其进行写入操作能够使得其它对该变量的读取操作读取到的变量值都是最新的),但是volatile并不能保证其它操作也是原子操作,仅仅是保证读取 写入操作而已。注意这个地方,很容易忽视这个定义导致出现异常。下面的代码中开了100个线程,每个线程都对n进行连续10次加1操作,由于n是类变量,因此所有线程都是对同一个n进行操作,理想结果是n从0开始每次递增1,递增至1000。但是运行结果并非如此。

public class VolatileTest implements Runnable{
    public static volatile int n = 0;

    @Override
    public void run() {
        for(int i = 0; i < 10; i++){
            // volatile只能保证对n的读取和写入操作是原子操作
            // 并且保证写入操作是先行发生的
            // 但是volatile不能保证其它操作也是原子操作
            // 比如这里的 + 1 操作就不是原子操作
            // 虽然每个线程读取n的值以及加1操作之后的给n写入值是原子操作且写入保证线性发生
            // 但是加1操作本身不是原子的,可能发生多个线程交替执行加1操作
            n = n + 1;
            
            System.out.println("Thread name: " + Thread.currentThread().getName() + ", n的值是: " + n);
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                System.out.println("线程: " + Thread.currentThread().getName() + "暂停3秒异常");
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Thread[] threads = new Thread[100];
        for (int i = 0; i < 100; i++){
            threads[i] = new Thread(new VolatileTest());
        }
        System.out.println("100个线程开始对n进行加1操作");
        for (int i = 0; i < 100; i++) {
            threads[i].start();
        }
        for (int i = 0; i < 100; i++) {
            threads[i].join();
        }
        System.out.println("100个线程对n进行加1操作结束");
        System.out.println("n : " + n);
    }
}

原因就在volatile上,n = n + 1;这个操作包括读取n的值、进行+ 1操作、写入n中,由于volatile的存在,读取n的值、写入n中是原子操作,但是+1操作并非原子操作。因此可能会有多个线程交替执行+1操作。

全部评论

相关推荐

吾族血脉,自吾始立铁律:凡我子孙,胆敢研习计算机之术者,当受七窍流血之刑!若见Python之书,必遭雷殛;若触Java代码,定为不孝!键盘鼠标准入族谱秽物录,显示器乃摄魂邪镜祖祠前当立戒碑:"二进制者,断子绝孙之道也!"算法者,乱我族心智之毒也!数据结构,毁我门风之刃也!倘有逆子偷装&nbsp;vscode,即按祖规捆于祠堂梁柱,令其DEBUG至死不得解脱!今颁天条三则:壹)三代血亲不得报考计算机系违者削去辈分,永世称码奴贰)族中幼童须背《戒算经》"if-else咒,switch符,皆是断头术"叁)凡见子侄讨论编程者须即刻砸其电脑,焚其书籍泼黑狗血于键盘之上!太祖母口谕:"吾宁要文盲孙,不要程序员!"尔...
好吃的薯饼:姐妹这不是我们计算机系吧,我们计算机系的都在言情小说里当黑客大佬,各种竞赛拿奖拿到手软,公司系统道路监控随便入侵。身体线条非常优美,挺拔的站姿十分端正,给人以强壮有内涵的感觉。脸庞轮廓深刻,五官分明透露着对太阳底下最光辉的职业的向往和坚定,尤其是那双深邃的眼睛,写满了对代码和计算机系统的热情和无限的活力。我们计算机系是天之骄子、明日之星,人手一个博士学位不然高中电脑老师都当不上。组会的时候,面对导师和同事的疑难问题,也能够回答自如。我们总是把高高的发际线当做荣耀的象征。妈咪这不素我们计算机系吧,集美集帅怎么只会写hello world?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务