首页 > 其他分享 >volatile

volatile

时间:2024-08-14 15:28:57浏览次数:4  
标签:false Thread flag boolean 线程 volatile

共享变量+volitale

  • 保证线程间的可见性
  • 禁止指令重排
/* 
一、boolean flag运行结果:
线程1 flag=false
【一直阻塞】

二、volatile boolean flag运行结果:
线程2 循环次数=71585922
线程2 over
线程1 flag=false
 **/
public class T {
    private static volatile boolean flag = true;

    public static void main(String[] args) {
        new Thread(() -> {
            try {
                //保证线程2 先与 线程1 执行
                Thread.sleep(20);
                flag = false;
                System.out.println(Thread.currentThread().getName() + " flag=" + flag);
            } catch (Exception e) {

            }

        }, "线程1").start();

        new Thread(() -> {
            try {
                int counter = 0;
                //boolean flag:线程2 一直阻塞状态,说明JIT底层优化了
                //volatile boolean flag:禁止指令重排,即禁止JIT底层代码优化
                while (flag) {
                    ++counter;
                }
                System.out.println(Thread.currentThread().getName() + " 循环次数=" + counter);
            } catch (Exception e) {

            }
            System.out.println(Thread.currentThread().getName() + " over");
        }, "线程2").start();
    }
}

标签:false,Thread,flag,boolean,线程,volatile
From: https://www.cnblogs.com/goodluckxiaotuanzi/p/18359073

相关文章

  • 面试官:说说volatile应用和实现原理?
    volatile是并发编程中的重要关键字,它的名气甚至是可以与synchronized、ReentrantLock等齐名,也是属于并发编程五杰之一。需要注意的是volatile并不能保证原子性,因此使用volatile并没有办法保证线程安全。并发编程五杰:PS:“并发编程五杰”是我个人起的名字,大家也不用太......
  • 【多线程-从零开始-伍】volatile关键字和内存可见性问题
    volatile关键字importjava.util.Scanner;publicclassDemo2{privatestaticintn=0;publicstaticvoidmain(String[]args){Threadt1=newThread(()->{while(n==0){//啥都不写......
  • c语言学习 volatile __attribute__ const
    1volatile在C语言中,volatile是一个类型修饰符,用于告诉编译器某个变量的值可能会被外部因素改变,从而避免编译器对该变量进行优化。这在多线程编程或硬件编程中非常重要。用法volatileintmyVar;何时使用volatile硬件寄存器:当变量映射到某个硬件寄存器。中断服务例......
  • volatile
    可见性问题复现线程1不会停止,因为线程2改变了a的值,线程1不知道publicclassTest{publicstaticIntegera=1;publicstaticvoidmain(String[]args){//线程1根本停不下来newThread(()->{while(a==1){......
  • JavaEE 初阶(8)——多线程6之线程安全下-->volatile
    之前,我们在 JavaEE初阶(6) 这篇文章中,谈到过引起线程不安全的原因,初步了解了 “可见性” “Java内存模型” “指令重排序”,本章讲解volatile会涉及到这三个知识点,详细内容可以参考  JavaEE初阶(6) 这篇文章。目录一. 引入二.volatile关键字 a.保证“可......
  • volatile 关键字的工作机制
    Author:ACatSmilingSince:2024-07-24volatile关键字:是Java编程语言中的一个重要工具,用于控制变量在多线程环境中的可见性和有序性。前置知识指令重排序指令重排序(InstructionReordering):是现代处理器和编译器优化技术的一部分,旨在提高程序执行效率。通过改变指令的执......
  • GCC在C语言中内嵌汇编 asm __volatile__
    from: https://www.cnblogs.com/hiveme/p/8194832.html在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可,GCC会自动插入代码......
  • Volatile不保证原子性及解决方案
    原子性的意义原子性特别是在并发编程领域,是一个极其重要的概念,原子性指的是一个操作或一组操作要么全部执行成功,要么全部不执行,不会出现部分执行的情况。这意味着原子性操作是不可分割的,它们在执行过程中不会被其他操作中断或干扰。原子性的意义在于它保证了数据的一致性和程序......
  • volatile关键字
    volatile可以保证可见性,但不保证原子性:当写一个volatile变量时,JMM会把该线程在本地内存中的变量强制刷新到主内存中去;这个写操作会导致其他线程中的volatile变量缓存无效。volatile会禁止指令重排重排序需要遵守的规则:重排序不会对存在数据依赖关系的操作进行重排......
  • auto,static,const,extern,volatile,register
    auto关键字用于声明变量的生存期为自动,auto修饰的是自动类型的变量,对于局部变量默认就是自动类型的变量,如果没有赋初值它的值就是随机值。static 修饰的变量或者函数有如下特点:static修饰的局部变量,可以延长变量的生命周期(不会被多次初始化)static修饰的全局变量或者函数只......