深入浅析java中挥发性与锁的原理

  介绍

深入浅析java中挥发性与锁的原理?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

<强> java中挥发性和锁原理分析

java中挥发性和锁是用于线程协同同步的两种机制。

<>强挥发性

挥发性是java中的一个关键字,它的作用有

    <李>保证变量的可见性李 <李>防止重排序李 <李>保证64位变量(长,双)的原子性读写
      李,

波动在Java语言规范中规定的是

 Java编程语言允许线程访问共享变量(§17.1)。作为一个规则,以确保
  更新共享变量一致并且可靠,线程应该确保它
  独占使用的变量通过获得一个锁,一般来说,执行共同
  排除那些共享变量。
  Java编程语言提供了一个机制,volatile字段,这是更方便
  比锁定的目的。
  字段可能宣布挥发性,在这种情况下,Java内存模型确保所有线程
  看到一个一致的变量的值。
  这是一个编译时错误如果最后一个变量也宣布不稳定。

Java内存模型中规定了动荡的之前效果,对挥发性变量的写操作之前于后续的读。这样变波动量能够确保一个线程的修改对其他线程可见.volatile因为不能保证原子性,所以不能在有约束或后验条件的场景下使用,如我+ +,常用的场景是停止变量保证系统停止对其他线程可见,仔细检查锁单例中防止重排序来保证安全发布等。

以下面这段代码为例

公共类TestVolatile {
  私有静态不稳定的布尔停止=false;
  公共静态void main (String [] args) {
  停止=true;
  布尔b=停止;
  }
  }

停止字段声明为挥发性类型后,编译后的字节码中其变量的access_flag中ACC_VOLATILE位置为1。

<强>关键的字节码内容如下

公共静态void main(以[]);
  描述符:((Ljava/lang/String;) V
  国旗:ACC_PUBLIC ACC_STATIC
  代码:
  堆栈=1,当地人=2,args_size=1
  0:iconst_1
  1:putstatic # 2//视场光阑:Z
  4:getstatic # 2//视场光阑:Z
  7:istore_1
  8:返回
  LineNumberTable:
  第14行:0
  15行:4
  16行:8
  LocalVariableTable:
  开始长槽的名字签名
  0 9 0 args (Ljava/lang/String;
  8 1 1 b Z
  静态{};
  描述符:V ()
  国旗:ACC_STATIC
  代码:
  堆栈=1,当地人=0,args_size=0
  0:iconst_0
  1:putstatic # 2//视场光阑:Z
  4:返回
  LineNumberTable:
  第11行:0
  }

通过hsdis查看虚拟机产生的汇编代码。

测试环境为

在执行参数上添加

- xx: + UnlockDiagnosticVMOptions   - xx: + LogCompilation   - xx: + PrintAssembly   -Xcomp   - xx: CompileCommand=dontinline * TestVolatile.main   - xx: CompileCommand=compileonly * TestVolatile。

查主要看主方法的汇编指令结果

 0 x000000010c732c50解码编译方法:
  代码:
  (拆卸马赫=& # 39;i386: x86 - 64 & # 39;】
  (入口)
  (验证入口点)
  (常量)
  #{方法}{0 x000000012422a2c8} & # 39;主要# 39;& # 39;([Ljava/lang/String;) v # 39;& # 39;com/concurrent/volatiles/TestVolatile& # 39;
  # parm0:肢体重复性劳损症:rsi=& # 39; (Ljava/lang/String; & # 39;
  #][sp + 0 x40(调用者的sp)
  0 x000000010c732da0: mov % eax, 0 x14000(%负责)
  0 x000000010c732da7:推动% rbp
  0 x000000010c732da8:子$ 0 x30 %负责
  0 x000000010c732dac: movabs $ 0 x12422a448 % rdi;{{元数据(方法数据方法}{0 x000000012422a2c8} & # 39;主要# 39;& # 39;([Ljava/lang/String;) v # 39;在& # 39;com/concurrent/volatiles/TestVolatile& # 39;)}
  0 0 x000000010c732db6: mov xdc (% rdi), % ebx
  0 x000000010c732dbc:添加0×8美元,% ebx
  0 x000000010c732dbf: mov % ebx 0 xdc (% rdi)
  0 x000000010c732dc5: movabs $ 0 x12422a2c8 % rdi;{元数据({方法}{0 x000000012422a2c8} & # 39;主要# 39;& # 39;([Ljava/lang/String;) v # 39;在& # 39;com/concurrent/volatiles/TestVolatile& # 39;)}
  0 x000000010c732dcf: $ 0 x0, % ebx
  0 x000000010c732dd2: cmp $ 0 x0, % ebx
  0 x000000010c732dd5:我0 x000000010c732e03; * iconst_1
  ;——com.concurrent.volatiles。TestVolatile: main@0(14)行
  0 x000000010c732ddb: movabs $ 0 x76adce798 %肢体重复性劳损症;{oop (& # 39; java/lang/类# 39;=& # 39;com/concurrent/volatiles/TestVolatile& # 39;)}
  0 x000000010c732de5: mov $ 0 x1, % edi
  0 x000000010c732dea: mov %, 0 x68(%肢体重复性劳损症)
  0 x000000010c732dee:锁addl $ 0 x0,(%负责);* putstatic停止
  ;——com.concurrent.volatiles。TestVolatile: main@1(14)行
  0 0 x000000010c732df3: movsbl x68(%肢体重复性劳损症),% esi; * getstatic停止
  ;——com.concurrent.volatiles。TestVolatile: main@4(15行)
  0 x000000010c732df7:添加$ 0 x30 %负责
  0 x000000010c732dfb:流行% rbp
  0 x000000010c732dfc:测试% eax, 0 x3adbd02 x0000000108c57100 (% rip) # 0
  ;{poll_return}
  0 x000000010c732e02: retq
  0 x000000010c732e03: mov % rdi 0×8(%负责)
  0 x000000010c732e08: movq $ 0 xffffffffffffffff(%负责)
  0 x000000010c732e10: callq 0 x000000010c7267e0;OopMap {rsi=Oop掉=117}
  *同步条目;
  ;——com.concurrent.volatiles。TestVolatile: main@-1(14)行
  ;{runtime_call}
  jmp 0 0 x000000010c732e15: x000000010c732ddb
  0 x000000010c732e17: nop
  0 x000000010c732e18: nop
  0 0 x000000010c732e19: mov x2a8 (% r15), %伸展
  0 x000000010c732e20: movabs $ 0 x0, % r10
  0 x000000010c732e2a: mov % r10 0 x2a8 (% r15)
  0 x000000010c732e31: movabs $ 0 x0, % r10
  0 x000000010c732e3b: mov % r10 0 x2b0 (% r15)
  0 x000000010c732e42:添加$ 0 x30 %负责
  0 x000000010c732e46:流行% rbp
  0 x000000010c732e47: jmpq 0 x000000010c6940e0;{runtime_call}
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null

深入浅析java中挥发性与锁的原理