深度理解volatile关键字

最轻量的同步机制编程

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

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

当其余线程调用的时候,会将本身线程当中保存的变量值置为无效,而后从新重主内存获取ide

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

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

运算方式线程

public volatile int age = 200;

set age = age+20; // 没法保证操做的原子性

这就是运算赋值(简写)

测试用例:code

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();
    }

}

返回测试结果:blog

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

内容关于:并发编程

本文属于做者原创,未经容许,禁止转发

相关文章
相关标签/搜索