深度理解volatile关键字

最轻量的同步机制

获取被volatile修饰的变量的时候,每次都要从主内存中获取

设置被volatile修饰的变量的时候,每次都要刷回主内存当中

当其他线程调用的时候,会将自己线程当中保存的变量值置为无效,然后重新重主内存获取

在读取和写入到主内存的时候,不会进行加锁,所以称之为最轻量的同步机制

volatile不是线程安全的,他只能保证变量的可见性,无法保证其原子性,如果设置的时候采用运算方式,那么将无法保证线程安全

运算方式

public volatile int age = 200;

set age = age+20; // 无法保证操作的原子性

这就是运算赋值(简写)

测试用例:

复制代码
package org.dance.day1.vola;

import org.dance.tools.SleepTools;

/**
 * volatile无法保证操作的原子性
 * @author ZYGisComputer
 */
public class VolatileUnsafe {

    private static class VolatileVar implements Runnable{

        private volatile int a = 0;

        @Override
        public void run() {
            String name = Thread.currentThread().getName();
            a = a + 1;
            System.out.println(name + ":" + a);
            SleepTools.ms(100);
            a = a + 1;
            System.out.println(name + ":" + a);
        }
    }

    public static void main(String[] args) {
        VolatileVar volatileVar = new VolatileVar();
        Thread thread = new Thread(volatileVar);
        Thread thread1 = new Thread(volatileVar);
        Thread thread2 = new Thread(volatileVar);
        Thread thread3 = new Thread(volatileVar);
        thread.start();
        thread1.start();
        thread2.start();
        thread3.start();
    }

}
复制代码

返回测试结果:

Thread-0:1
Thread-3:4
Thread-2:3
Thread-1:2
Thread-0:5
Thread-1:7
Thread-2:6
Thread-3:5

可以看见volatile无法保证操作的原子性

所以说volatile关键字适用于一个线程写,多个线程读的场景,因为他只能保证可见性,不能保证原子性

作者:彼岸舞

时间:2020\09\15

内容关于:并发编程

本文属于作者原创,未经允许,禁止转发

posted @   彼岸舞  阅读(271)  评论(2编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示