深度理解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 @ 2020-09-15 16:33  彼岸舞  阅读(258)  评论(2编辑  收藏  举报