IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Volatile理解 -> 正文阅读

[Java知识库]Volatile理解

????????最近网上看到一份题目,发现好多题目都是只有印象知道大概,具体深入的地方记不清了

volatile三大特性:

? ? ? ? 1. 保证可见性

? ? ? ? 2.不保证原子性

? ? ? ? 3.禁止指令重排

可见性:当一个线程修改了主内存(堆)中对象的值时,通知其他线程值已经修改

可见性验证:代码验证

import javax.swing.plaf.basic.BasicTreeUI;
import java.util.concurrent.TimeUnit;

/**
 * @Author: chenoyongqiao
 * @Description:
 * @Date:Created in 8:10 2021/8/8
 * @Modified By:
 */
public class VolatileDemo {

    public static void main(String[] args) {
        MyDate myDate = new MyDate();
        new Thread(() -> {
            while (myDate.runFlag) {
                //当线程2修改了主内存中的runFlag,线程1也不会识到,循环不会停止
            }
            System.out.println(Thread.currentThread().getName() + "任务结束");
        }, "线程1").start();
        new Thread(() -> {
            try {
                System.out.println(Thread.currentThread().getName() + "进入");
                //线程2休眠1秒保证线程1先拿到runFlag
                TimeUnit.SECONDS.sleep(1);
                // 线程操控资源类
                myDate.runFlag = false;
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "线程2").start();
        //System.out.println("主线程结束");
    }
}

class MyDate {
    //增加volatile修改后runFlag具有可见性
    volatile Boolean runFlag = true;
    //Boolean  runFlag = true;
    Integer number = 0;

    void addTo10() {
        this.number = 10;
    }
}

原子性:指一个操作要么完成,要么失败不能中断。

原子性代码验证:gitee代码验证

        for (int i = 0; i < 100; i++) {
            new Thread(()->{
                myDate.addAndAdd();
            },"验证原子性"+i).start();
        }
        System.out.println("验证原子性多次增加后值"+myDate.number);
    }
}

class MyDate {
    //增加volatile修改后runFlag具有可见性
    volatile Boolean runFlag = true;
    //Boolean  runFlag = true;
    volatile Integer number = 0;
    // 使用原子类保证原子性
    void addTo10() {
        this.number = 10;
    }

volatile不能保证原子性怎么处理?

使用原子类进行处理使用原子类解决volatile不能保证原子性的问题

volatile Integer number = 0;
    // 使用原子类保证原子性
    AtomicInteger atomicInteger = new AtomicInteger();
    void addTo10() {
        this.number = 10;
    }
    void addAndAdd(){
        this.number++;
        atomicInteger.getAndAdd(1);
    }

?

原子类为什么可以保证原子性:

? ? ? ? 原子类调用jdk中rt.jar? com.misc.Unsafe?

/**
     * Atomically adds the given value to the current value.
     *
     * @param delta the value to add
     * @return the previous value
     */
    public final int getAndAdd(int delta) {
        return unsafe.getAndAddInt(this, valueOffset, delta);
    }

3

传入三个参数,对象本身(预期值,从主内存中复制得到,后面会讲的)、值偏移量(对象的内存地址/指针)、add的入参。

public final int getAndAddInt(Object var1, long var2, int var4) {
        int var5;
        do {
            var5 = this.getIntVolatile(var1, var2);
        } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

        return var5;
    }
var5 = this.getIntVolatile(var1, var2);通过native拿到内存中的最新值,这个值为预期值
compareAndSwapInt(var1, var2, var5, var5 + var4));CAS思想,比较预期值与内存中的真实值,相等则将var5+var4更新到内存,否则更新var的值继续这个比较过程。

?

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-09 10:06:43  更:2021-08-09 10:08:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/11 1:42:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码