深度理解volatile关键字

时间:2022-07-26
本文章向大家介绍深度理解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关键字适用于一个线程写,多个线程读的场景,因为他只能保证可见性,不能保证原子性