首页 > 其他分享 >不同关键字的原子性、可见性、有序性之间的比较

不同关键字的原子性、可见性、有序性之间的比较

时间:2024-08-23 19:53:12浏览次数:11  
标签:变量 原则 保障 原子 关键字 线程 内存 有序性 操作

一、多线程中有三个非常重要的特性

1. 原子性

    在一次或者多次操作时,要么所有操作都被执行,要么所有操作都不执行

2. 有序性

    程序执行的顺序按照代码的先后顺序执行,没有进行优化和顺序调整。

    为了提高程序的运行效率,Java可能在JVM编译期和运行期会对代码指令进行一定的优化,不会百分之百的保证代码的执行顺序严格按照编写代码中的顺序执行,但也不是随意进行重排序,它会保证程序的最终运算结果是编码时所期望的。这种情况被称之为指令重排

3. 可见性

   当一个线程对共享变量进行修改后,其他一个线程可以立即看到该变量修改后的最新值

二、说到三个特性,就不得不提Java内存模型(JMM)

       JMM是一种抽象概念,并不真实存在,它描述的是一组规范。JVM运行程序的实体是线程,每个线程都有一个属于自己私有的工作内存。Java内存模型中规定了:所有变量都存储在主内存中,主内存是一块共享内存区域,所有线程都可以访问。

       但是,线程对变量的读取赋值等操作必须在自己的工作内存中进行,在操作之前先把变量从主内存中复制到自己的工作内存中,然后对变量进行操作,操作完成后再把变量写回主内存。因为线程不能直接操作主内存中的变量,所以线程的工作内存中存放的是主内存中变量的一个副本而已。

三、如何保证有序性

Java内存模型的一个叫 Happens-Before 的原则了。如果两个操作的执行顺序无法从Happens-Before原则推到出来,那么可以对它们进行随意的重排序处理了。Happens-Before原则有下面这些原则,希望你能记住:

1. 程序次序原则:一段代码在单线程中执行的结果是有序的。
2. 锁定原则:一个锁处于被锁定状态,那么必须先执行unlock操作后面才能进行lock操作。
3. volatile变量原则:同时对volatile变量进行读写操作,写操作一定先于读操作。
4. 线程启动原则:Thread对象的start方法先于此线程的每一个动作。
5. 线程终结原则:线程中的所有操作都先于对此线程的终止检测。
6. 线程中断原则:对线程interrupt方法的调用先于被中断线程的代码检测到中断事件的发生。
7. 对象终结原则:一个对象的初始化完成先于它的finalize方法的开始。
8. 传递原则:操作A先于操作B,操作B先于操作C,那么操作A一定先于操作C。
9. 除了Happens-Before原则提供的天然有序性,我们还可以用以下几种方式保证有序性:

四、总结一下

特性volatile关键字Lock接口synchronized关键字Atomic变量
原子性无法保障可以保障可以保障可以保障
可见性可以保障可以保障可以保障可以保障
有序性一定程度保障可以保障可以保障无法保障

标签:变量,原则,保障,原子,关键字,线程,内存,有序性,操作
From: https://blog.csdn.net/go9898/article/details/141473343

相关文章

  • 初学 Delphi 嵌入汇编[2] - 汇编语言关键字
    汇编语言不区分大小写.关键字用途AH AL AND AX BH BL BP BX BYTE CH CL CS CX DH DI DL DS DWORD DX EAX EBP EBX ECX EDI EDX EIP ES ESI ESP FS ......
  • Java中的static关键字
    static可以用来修饰成员变量,也能修饰成员方法。1.1static修饰成员变量Java中的成员变量按照有无static修饰分为两种:类变量、实例变量。它们的区别如下图所示: 由于静态变量是属于类的,只需要通过类名就可以调用:类名.静态变量实例变量是属于对象的,需要通过对象才能调用:对......
  • Java基础——自学习使用(static关键字)
    一、static关键字是什么?static修饰的代码属于类,定义的变量存储在方法区的静态常量池当中二、static可以修饰什么1.static修饰变量static修饰的变量叫做类变量,被所有该类产生的对象所共享,存储在方法区的静态常量池中2.static修饰方法static修饰是的方法属于静态方法,stat......
  • Java基础--static关键字
    引言        在Java编程中,static关键字是一个非常重要的概念。它可以用于变量、方法、代码块。提供了在内存管理和代码结构上的独特优势,理解并正确使用static关键字是掌握Java编程的重要一步。static关键字是什么?    static关键字是Java中的一个修饰符,用于......
  • Static关键字详解
    Static关键字是什么static修饰的代码属于类定义的变量存储在方法区的静态常量池当中java为什么要设置static关键字?因为要方便类去使用自己的方法和变量例如:1.方法和变量上面没有static关键字packageWork1;publicclassA{publicStringname="张三";pub......
  • Java——三个关键字 static 2
    1.简介在Java中,static表示“静态的”,它也是一种修饰符,可以修饰属性、方法、代码块和内部类。2.特性static修饰符具有如下特性:● 被static修饰的属性(成员变量)称为静态变量,也叫做类变量;● 被static修饰的常量称为静态常量;● 被static修饰的方法称为静态方法,也叫做类......
  • Java——三个关键字:static
    static关键字在Java中,static是一个关键字,用于修饰类的成员(变量、方法等)。静态成员属于类本身而不是类的实例,这意味着每个类都有唯一的静态变量副本,所有该类的对象共享这个副本,而不论创建了多少个对象。有static修饰的代码和没有static修饰的代码的区别:有static修饰的代码属......
  • 关键字、标识符、注释三剑客
    关键字概述被Java语言赋予特定含义的单词关键字特点组成关键字的字母全部小写关键字注意事项goto和const作为保留字存在,目前并不使用类似IDEA这样的集成工具,针对关键字有特殊的颜色标记,非常直观标识符概述就是给类,接口,方法,变量等起名字时使用的字符序列组成规则......
  • 磁性原子增加磁矩
    现在vasp里用vaspkit401超胞,再导入VESTA,这样才能在VESTA显示原子序数。打开VESTA,导入扩胞后的文件,点击object里的L,这样才会有原子序数,注意坐标方向后续都是这个坐标朝向。点击edit里的vectors,点击new新增,以下为默认值,(0,0,1)表示箭头平行于Z平面,可以先试一下001的箭头朝向......
  • Java中关键字static的学习
    static关键字目录static关键字静态变量(静态成员变量)静态方法静态初始化块静态内部类静态导入在Java中,static关键字是一个非常重要的修饰符,它主要用于创建静态变量、静态方法、静态初始化块、静态内部类以及静态导入。使用static关键字的主要目的是为了实现共享,即被static修饰的......