zoukankan      html  css  js  c++  java
  • 彻底弄明白之java多线程中的volatile

    一. volatite 简述

    Java 语言提供了一种稍弱的同步机制,即 volatile 变量.用来确保将变量的更新操作通知到其他线程,保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新. 当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的.

    二. volatite 线程安全?

    volatile 变量对所有线程是立即可见的,对 volatile 变量所有的写操作都能立即反应到

    其他线程之中,换句话说:volatile 变量在各个线程中是一致的,所以基于 volatile 变量的运算是线程安全的.  

    这句话论据貌似没有错,论点确实错的.

     

    三. volatite 为什么是线程不安全的?

     
      
    public class VolatileTest{
        
        public static volatile int  i;
    
        public static void increase(){
            i++;
        }
    }

      

    javap -c -l VolatileTest.class 

      

    public class VolatileTest {
      public static volatile int i;
     
      public VolatileTest();
        Code:
           0: aload_0       
           1: invokespecial #1                  // Method java/lang/Object."<init>":()V
           4: return        
        LineNumberTable:
          line 1: 0
     
      public static void increase();
        Code:
           0: getstatic     #2                  // Field i:I, 把i的值取到了操作栈顶,volatile保证了i值此时是正确的. 
           3: iconst_1      
           4: iadd                              // increase,但其他线程此时可能已经把i值加大了好多
           5: putstatic     #2                  // Field i:I ,把这个已经out of date的i值同步回主内存中,i值被破坏了.
           8: return        
        LineNumberTable:
          line 6: 0
          line 7: 8
    }

    从这个角度说 volatile 并不完全是线程安全的.

  • 相关阅读:
    LeetCode 326. Power of Three
    LeetCode 324. Wiggle Sort II
    LeetCode 322. Coin Change
    LeetCode 321. Create Maximum Number
    LeetCode 319. Bulb Switcher
    LeetCode 318. Maximum Product of Word Lengths
    LeetCode 310. Minimum Height Trees (DFS)
    个人站点大开发!--起始篇
    LeetCode 313. Super Ugly Number
    LeetCode 309. Best Time to Buy and Sell Stock with Cooldown (DP)
  • 原文地址:https://www.cnblogs.com/yakun/p/3589437.html
Copyright © 2011-2022 走看看