SlideShare a Scribd company logo
1 of 32
Download to read offline
了解CPU



        作者:周忱 | 淘宝综合业务
        微博:@MinZhou
        邮箱:zhouchen.zm@taobao.com
为什么Java程序员也需要了解CPU




                         关于我
 •   花名:周忱(chén)
 •   真名:周敏
 •   微博: @MinZhou
 •   Twitter: @minzhou
 •   2010年6月加入淘宝
 •   曾经淘宝Hadoop&Hive研发
     组Leader
 •   目前专注分布式实时计算
 •   Hive Contributor
 •   自由、开源软件热爱者




                               Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                         关于我
 •   花名:周忱(chén)
 •   真名:周敏
 •   微博: @MinZhou
 •   Twitter: @minzhou
 •   2010年6月加入淘宝
 •   曾经淘宝Hadoop&Hive研发
     组Leader
 •   目前专注分布式实时计算
 •   Hive Contributor
 •   自由、开源软件热爱者




                               Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                 什么是volatile?




                                Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                                  Puzzle 1
  下面哪个程序跑得更快?

    private static long value;         private static volatile long value;

    public static void increment() {   public static void increment() {
      while (value < 100000000L) {       while (value < 100000000L) {
        value++;                           value++;
      }                                  }
    }                                  }



                                         如果换成AtomicLong呢?

                                                            Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                                     Puzzle 2
   下面哪个程序跑得更快?

AtomicIntegerFieldUpdater state = …          AtomicIntegerFieldUpdater state= …

public void lock() {                         public void lock() {
  while(state.getAndSet(true)) {} ; //spin     while (true) {
}                                                while(state.get()) {}; //spin
                                                 if(!state.getAndSet(true))
                                                    return;
                                               }
                                             }

                                                      如果换成多线程呢?

                                                                  Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




           Intel 十年计划:Tick-Tock




                             Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                         CPU微架构变革
•   Hyper-threading
•   32KB L1d 与32KB L1i
•   256KB L2 Cache
•   4–12 MB L3 cache
•   QPI 代替FSB
•   PCI E和DMI整合入
    处理器, 北桥消失
•   支持 2/3通道DDR3




                                    Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                现代CPU微架构




                           Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




              Intel Nehalem 排布




                                 Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU



               Intel Sandy Bridge




                                    Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                                      Puzzle 3
   下面哪个程序跑得更快?

 private static long[][] longs;              private static long[][] longs;

 for (int i = 0; i < DIMENSION_1; i++) {     for (int j = 0; j < DIMENSION_2; j++) {
   for (int j = 0; j < DIMENSION_2; j++) {     for (int i = 0; i < DIMENSION_1; i++){
       sum += longs[i][j];                         sum += longs[i][j];
    }                                           }
 }                                           }




                                                                   Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU



                            CPU Cache




   cat /sys/devices/system/cpu/cpu0/cache/index0/*
                                                     Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




           Cache Coherence & MESI协议
  •   M: 修改
  •   E : 独占
  •   S : 共享
  •   I : 失效




  发音: messy




                               Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                                        Puzzle 4
   下面程序有什么问题?
 public final static class VolatileLong {    longs = new VolatileLong[NUM_THREADS];
   public volatile long value = 0L;          for (int i = 0; i < longs.length; i++) {
 }                                              longs[i] = new VolatileLong();
                                             }
 public class FS implements Runnable {       // 每个线程更新独立的变量
   public void run() {                       for (int i = 0; i < NUM_THREADS; i++) {
     long i = ITERATIONS + 1;                   threads[i] = new Thread(new FS(i)));
     while (0 != --i) {                      }
        longs[arrayIndex].value = i;        for (Thread t : threads) {
     }                                          t.start();
   }                                         }
 }                                          for (Thread t : threads) {
                                                t.join();
                                             }
                                                                   Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                     False Sharing
                            public final static class VolatileLong {
                              public volatile long value = 0L;
                            }


                            =>

                            public final static class VolatileLong {
                              public volatile long value = 0L;
                              public long p1, p2, p3, p4, p5, p6;
                            }




                                                  Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                     False Sharing
                            public final static class VolatileLong {
                              public volatile long value = 0L;
                            }


                            =>

                            public final static class VolatileLong {
                              public volatile long value = 0L;
                              public long p1, p2, p3, p4, p5, p6;
                            }




                                                  Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                     False Sharing
                            public final static class VolatileLong {
                              public volatile long value = 0L;
                            }


                            =>

                            public final static class VolatileLong {
                              public volatile long value = 0L;
                              public long p1, p2, p3, p4, p5, p6;
                            }




                                                  Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




         Cache Consistency & 乱序执行
  •   CPU指令重排序




  •   编译重排序




                             Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                 Memory Ordering
  •   程序顺序(Program ordering): 读写和指令编制一致, 也称强顺序.
  •   处理器顺序(Processor ordering): 加快指令执行速度, 例如读可跨越它之前
      的buffered写

  •   Intel386及之前内存顺序模型: 程序顺序
  •   Pentium和Intel486内存顺序模型:大多数情况下遵循程序顺序
  •   P6及以后内存顺序模型:处理器顺序, 同时提供其它加强或弱化内存顺序
      模型的特殊指令




                                         Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                     内存屏障
  •   Load Buffer
  •   Store Buffer
  •   CPU串行化指令
       – CPUID
       – SFENCE
       – LFENCE
       – MFENCE
  •   Lock系指令




                            Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                        Java内存模型
  •   Happens-Before       // Lock
  •   StoreStore          pthread_mutex_lock(&lock);
  •   LoadStore           sequence = i;
                          pthread_cond_signal(&condition);
  •   StoreLoad
                          pthread_mutex_unlock(&lock);
  •   LoadLoad
  •   Full Fence          // Soft Barrier
  •   锁和synchronized块     asm volatile(“” ::: “memory”);
  •   volatile 关键字        sequence = i;
  •   final 关键字
                          // Fence
                          asm volatile(“” ::: “memory”);
                          sequence = i;
                          asm volatile(“lock addl $0x0,(%rsp)”);

                                                      Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                                     Java内存模型
                                           需要内存屏
  重排序                次操作                                                           次操作
                                             障
            Normal   Volatile   Volatile                                            Volatile
            Load     Load       Store                       Normal     Normal       Load         Volatile
 首操作                                       首操作
            Normal   Monitor    Monitor                     Load       Store        MonitorEnt   Store
                                                                                    er
            Store    Enter      Exit
 Normal                                    Normal Load                                           LoadStore
 Load
                                No
 Normal                                    Normal Store                                          StoreStore
 Store
 Volatile
 Load                                      Volatile Load
            No       No         No                          LoadLoad   LoadStore    LoadLoad     LoadStore
                                           MonitorEnter
 Monitor
 Enter
 Volatile
 store                                     Volatile Store
                     No         No                                                  StoreLoad    StoreStore
 Monitor                                   MonitorExit
 Exit

                                                                                Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                                           Example
1. class X {                   $ java -XX:+UnlockDiagnosticVMOptions -XX:PrintAssemblyOptions=hsdis-print-bytes -
2.   int a, b;                 XX:CompileCommand=print,X.f X
3.   volatile int v, u;
4.   void f() {                …
5.     int i, j;
6.
7.     i = a; // load a
                               [Verified Entry Point]
8.     j = b; // load b         0xb3a1e28c: push %ebp ;...55
9.     i = v; // load v         0xb3a1e28d: sub $0x8,%esp ;...81ec0800 0000
10.            // LoadLoad      0xb3a1e293: mov 0x10(%ecx),%ebx ;...8b5910 ; i = v
11.    j = u; // load u         0xb3a1e296: mov 0x14(%ecx),%edi ;...8b7914 ; j = u
12.            // LoadStore     0xb3a1e299: mov %ebx,0x8(%ecx) ;...895908 ; a = i
13.    a = i; // store a        0xb3a1e29c: mov %edi,0xc(%ecx) ;...89790c      ;b=j
14.    b = j; // store b        0xb3a1e29f: mov %ebx,0x10(%ecx) ;...895910 ; v = i
15.            // StoreStore    0xb3a1e2a2: mov %edi,0x14(%ecx) ;...897914 ; u = j
16.    v = i; // store v        0xb3a1e2a5: lock addl $0x0,(%esp) ;...f0830424 ; memory barrier
17.            // StoreStore
                                0xb3a1e2aa: mov 0x14(%ecx),%ebp ;...8b6914 ; i = u
18.    u = j; // store u
19.            // StoreLoad
                                0xb3a1e2ad: mov %ebp,0x8(%ecx) ;...896908 ; a = i
20.    i = u; // load u         0xb3a1e2b0: add $0x8,%esp ;...83c408
21.            // LoadLoad      0xb3a1e2b3: pop %ebp ;...5d
22.            // LoadStore     0xb3a1e2b4: test %eax,0xb78ab000 ;...850500b0 8ab7
23.    j = b; // load b
24.    a = i; // store a       …
25. }
26.}
                               参考: jdk/hotspot/src/os_cpu/linux_x86/vm/orderAccess_linux_x86.inline.hpp
                                                                                       Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                        Puzzle 5


  为什么有volatile还需要AtomicXX及
  Unsafe.compareAndSwapXX?




                                   Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                            原子指令
  •   CompareAndSwap: LOCK XCHG
  •   LOCK XADD
  •   ABA问题




                                   Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                                       让步锁

 public class BackoffLock {                   if (!state.getAndSet(true)) {
  private AtomicBoolean state = new                  return;
 AtomicBoolean(false);                             } else {
  private static final int MIN_DELAY = ...;          backoff.backoff();
  private static final int MAX_DELAY = ...;        }
                                                 }
  public void lock() {                         }
   Backoff backoff = new Backoff(MIN_DELAY,
 MAX_DELAY);                                      public void unlock() {
   while (true) {                                   state.set(false);
    while (state.get()) {};                       }

                                              }

                                                                  Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                                   队列锁
  •   BackOff锁的问题
       – Cache-coherence Traffic
       – 临界区利用率
       – 公平性问题
       – 饥饿
  •   基于数组的队列
  •   CLH队列
  •   MCS队列
  •   NUMA-Aware变种




                    https://blogs.oracle.com/dave/entry/flat_combining_numa_locks
                                                             Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                     Puzzle 6


     为什么j.u.c或者jvm里面在加锁的时候, 喜欢用先
     CAS spin尝试N次, 如果失败则yield多次(可选), 如果
     最后还是失败则park, 同时把线程加到队列里?




                                Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                              工具
   •   top
   •   vmstat
   •   lscpu
   •   perf
   •   Valgrind tools suite
   •   OProfile
   •   SystemTap
   •   numactl
   •   Intel Vtune
   •   MAT


                                   Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                             推荐读物
   •   What every programmer should know about memory
   •   Intel® 64 and IA-32 Architectures Software Developer Manuals
   •   The Art of Multiprocessor Programming
   •   The JSR-133 Cookbook for Compiler Writers (Java Memory Model)
   •   本人博客: http://coderplay.javaeye.com




                                                       Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                     Q&A




                           作者:周忱 | 淘宝综合业务
                           微博:@MinZhou
                           邮箱:zhouchen.zm@taobao.com



                                   Taobao Java Team | zhouchen.zm

More Related Content

What's hot

Effective linux.3.(diagnosis)
Effective linux.3.(diagnosis)Effective linux.3.(diagnosis)
Effective linux.3.(diagnosis)wang hongjiang
 
深入剖析Concurrent hashmap中的同步机制(上)
深入剖析Concurrent hashmap中的同步机制(上)深入剖析Concurrent hashmap中的同步机制(上)
深入剖析Concurrent hashmap中的同步机制(上)wang hongjiang
 
Java7 fork join framework and closures
Java7 fork join framework and closuresJava7 fork join framework and closures
Java7 fork join framework and closureswang hongjiang
 
IOS入门分享
IOS入门分享IOS入门分享
IOS入门分享zenyuhao
 
高性能的Java代码编写及常见问题排查
高性能的Java代码编写及常见问题排查高性能的Java代码编写及常见问题排查
高性能的Java代码编写及常见问题排查bluedavy lin
 
Exodus重构和向apollo迁移
Exodus重构和向apollo迁移Exodus重构和向apollo迁移
Exodus重构和向apollo迁移wang hongjiang
 
Nashorn on JDK 8 (ADC2013)
Nashorn on JDK 8 (ADC2013)Nashorn on JDK 8 (ADC2013)
Nashorn on JDK 8 (ADC2013)Kris Mok
 
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行APIJava SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行APIJustin Lin
 
UseNUMA做了什么?(2012-03-14)
UseNUMA做了什么?(2012-03-14)UseNUMA做了什么?(2012-03-14)
UseNUMA做了什么?(2012-03-14)Kris Mok
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7Justin Lin
 
Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出wang hongjiang
 
Hash map导致cpu100% 的分析
Hash map导致cpu100% 的分析Hash map导致cpu100% 的分析
Hash map导致cpu100% 的分析wang hongjiang
 
如何用JDK8實作一個小型的關聯式資料庫系統
如何用JDK8實作一個小型的關聯式資料庫系統如何用JDK8實作一個小型的關聯式資料庫系統
如何用JDK8實作一個小型的關聯式資料庫系統なおき きしだ
 
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDEJava SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDEJustin Lin
 
Spock:願你的測試長長久久、生生不息
Spock:願你的測試長長久久、生生不息Spock:願你的測試長長久久、生生不息
Spock:願你的測試長長久久、生生不息Shihpeng Lin
 
如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scala如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scalajavatwo2011
 
並行與平行
並行與平行並行與平行
並行與平行Justin Lin
 
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行APIJava SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行APIJustin Lin
 

What's hot (20)

Exodus2 大局观
Exodus2 大局观Exodus2 大局观
Exodus2 大局观
 
Effective linux.3.(diagnosis)
Effective linux.3.(diagnosis)Effective linux.3.(diagnosis)
Effective linux.3.(diagnosis)
 
Aswan&hump
Aswan&humpAswan&hump
Aswan&hump
 
深入剖析Concurrent hashmap中的同步机制(上)
深入剖析Concurrent hashmap中的同步机制(上)深入剖析Concurrent hashmap中的同步机制(上)
深入剖析Concurrent hashmap中的同步机制(上)
 
Java7 fork join framework and closures
Java7 fork join framework and closuresJava7 fork join framework and closures
Java7 fork join framework and closures
 
IOS入门分享
IOS入门分享IOS入门分享
IOS入门分享
 
高性能的Java代码编写及常见问题排查
高性能的Java代码编写及常见问题排查高性能的Java代码编写及常见问题排查
高性能的Java代码编写及常见问题排查
 
Exodus重构和向apollo迁移
Exodus重构和向apollo迁移Exodus重构和向apollo迁移
Exodus重构和向apollo迁移
 
Nashorn on JDK 8 (ADC2013)
Nashorn on JDK 8 (ADC2013)Nashorn on JDK 8 (ADC2013)
Nashorn on JDK 8 (ADC2013)
 
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行APIJava SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
 
UseNUMA做了什么?(2012-03-14)
UseNUMA做了什么?(2012-03-14)UseNUMA做了什么?(2012-03-14)
UseNUMA做了什么?(2012-03-14)
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7
 
Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出
 
Hash map导致cpu100% 的分析
Hash map导致cpu100% 的分析Hash map导致cpu100% 的分析
Hash map导致cpu100% 的分析
 
如何用JDK8實作一個小型的關聯式資料庫系統
如何用JDK8實作一個小型的關聯式資料庫系統如何用JDK8實作一個小型的關聯式資料庫系統
如何用JDK8實作一個小型的關聯式資料庫系統
 
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDEJava SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
 
Spock:願你的測試長長久久、生生不息
Spock:願你的測試長長久久、生生不息Spock:願你的測試長長久久、生生不息
Spock:願你的測試長長久久、生生不息
 
如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scala如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scala
 
並行與平行
並行與平行並行與平行
並行與平行
 
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行APIJava SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
 

Similar to Java cpu

Java Concurrent Optimization: Concurrent Queue
Java Concurrent Optimization: Concurrent QueueJava Concurrent Optimization: Concurrent Queue
Java Concurrent Optimization: Concurrent QueueMin Zhou
 
线程与并发
线程与并发线程与并发
线程与并发Tony Deng
 
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUGYingSiang Geng
 
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代scott liao
 
千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7javatwo2011
 
高性能并发Web服务器实现核心内幕
高性能并发Web服务器实现核心内幕高性能并发Web服务器实现核心内幕
高性能并发Web服务器实现核心内幕ideawu
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版Jackson Tian
 
JavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization SkillsJavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization SkillsHo Kim
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践taobao.com
 
Python 于 webgame 的应用
Python 于 webgame 的应用Python 于 webgame 的应用
Python 于 webgame 的应用勇浩 赖
 
服务器端性能优化 提升Qps、rt
服务器端性能优化 提升Qps、rt服务器端性能优化 提升Qps、rt
服务器端性能优化 提升Qps、rt锐 张
 
IKVM.NET 深入敵營的 Java
IKVM.NET 深入敵營的 JavaIKVM.NET 深入敵營的 Java
IKVM.NET 深入敵營的 Java建興 王
 
Phpunit入门 r2
Phpunit入门 r2Phpunit入门 r2
Phpunit入门 r2Baohua Cai
 
Jni攻略之十一――启动虚拟机调用Java类
Jni攻略之十一――启动虚拟机调用Java类Jni攻略之十一――启动虚拟机调用Java类
Jni攻略之十一――启动虚拟机调用Java类yiditushe
 
Avm2虚拟机浅析与as3性能优化(陈士凯)
Avm2虚拟机浅析与as3性能优化(陈士凯)Avm2虚拟机浅析与as3性能优化(陈士凯)
Avm2虚拟机浅析与as3性能优化(陈士凯)FLASH开发者交流会
 
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)Shanda innovation institute
 
Inside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutor
Inside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutorInside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutor
Inside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutorAdy Liu
 

Similar to Java cpu (20)

Java Concurrent Optimization: Concurrent Queue
Java Concurrent Optimization: Concurrent QueueJava Concurrent Optimization: Concurrent Queue
Java Concurrent Optimization: Concurrent Queue
 
线程与并发
线程与并发线程与并发
线程与并发
 
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
探索 ISTIO 新型 DATA PLANE 架構 AMBIENT MESH - GOLANG TAIWAN GATHERING #77 X CNTUG
 
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
 
千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7
 
高性能并发Web服务器实现核心内幕
高性能并发Web服务器实现核心内幕高性能并发Web服务器实现核心内幕
高性能并发Web服务器实现核心内幕
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版
 
JavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization SkillsJavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization Skills
 
Scala
ScalaScala
Scala
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践
 
Python 于 webgame 的应用
Python 于 webgame 的应用Python 于 webgame 的应用
Python 于 webgame 的应用
 
服务器端性能优化 提升Qps、rt
服务器端性能优化 提升Qps、rt服务器端性能优化 提升Qps、rt
服务器端性能优化 提升Qps、rt
 
IKVM.NET 深入敵營的 Java
IKVM.NET 深入敵營的 JavaIKVM.NET 深入敵營的 Java
IKVM.NET 深入敵營的 Java
 
Phpunit入门 r2
Phpunit入门 r2Phpunit入门 r2
Phpunit入门 r2
 
Java 網路程式
Java 網路程式Java 網路程式
Java 網路程式
 
Jni攻略之十一――启动虚拟机调用Java类
Jni攻略之十一――启动虚拟机调用Java类Jni攻略之十一――启动虚拟机调用Java类
Jni攻略之十一――启动虚拟机调用Java类
 
Java Thread
Java ThreadJava Thread
Java Thread
 
Avm2虚拟机浅析与as3性能优化(陈士凯)
Avm2虚拟机浅析与as3性能优化(陈士凯)Avm2虚拟机浅析与as3性能优化(陈士凯)
Avm2虚拟机浅析与as3性能优化(陈士凯)
 
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)
 
Inside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutor
Inside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutorInside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutor
Inside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutor
 

Recently uploaded

Grade 6 Lesson 7 Environment Protection.pptx
Grade 6 Lesson 7 Environment Protection.pptxGrade 6 Lesson 7 Environment Protection.pptx
Grade 6 Lesson 7 Environment Protection.pptxPriscilleXu
 
003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdf
003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdf003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdf
003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdfshanshanhui1
 
JAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptx
JAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptxJAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptx
JAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptxCHANSUITNEEMoe
 
未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制
未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制
未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制gravestomas0
 
【国外大学文凭样本】多大毕业证认证Q/微:892798920办多伦多大学毕业证留信留服使馆公公证,多大硕士毕业证,U of T研究生毕业证,文凭,改U o...
【国外大学文凭样本】多大毕业证认证Q/微:892798920办多伦多大学毕业证留信留服使馆公公证,多大硕士毕业证,U of T研究生毕业证,文凭,改U o...【国外大学文凭样本】多大毕业证认证Q/微:892798920办多伦多大学毕业证留信留服使馆公公证,多大硕士毕业证,U of T研究生毕业证,文凭,改U o...
【国外大学文凭样本】多大毕业证认证Q/微:892798920办多伦多大学毕业证留信留服使馆公公证,多大硕士毕业证,U of T研究生毕业证,文凭,改U o...ggbob1
 
GPA低怎么办? | 身份黑后回复方案 | 出入境激活 身份恢复美本GPA太低了怎么办黑客服务,黑客修改大学成绩,黑客改成绩单,黑客入侵教务系统,找黑客修...
GPA低怎么办? | 身份黑后回复方案 | 出入境激活 身份恢复美本GPA太低了怎么办黑客服务,黑客修改大学成绩,黑客改成绩单,黑客入侵教务系统,找黑客修...GPA低怎么办? | 身份黑后回复方案 | 出入境激活 身份恢复美本GPA太低了怎么办黑客服务,黑客修改大学成绩,黑客改成绩单,黑客入侵教务系统,找黑客修...
GPA低怎么办? | 身份黑后回复方案 | 出入境激活 身份恢复美本GPA太低了怎么办黑客服务,黑客修改大学成绩,黑客改成绩单,黑客入侵教务系统,找黑客修...黑客 接单【TG/微信qoqoqdqd】
 
【創業簡報練習】當一個人吃飯會想起誰: (A)I-DOLL 陪吃娃娃|科技創業與營運實務
【創業簡報練習】當一個人吃飯會想起誰:(A)I-DOLL 陪吃娃娃|科技創業與營運實務【創業簡報練習】當一個人吃飯會想起誰:(A)I-DOLL 陪吃娃娃|科技創業與營運實務
【創業簡報練習】當一個人吃飯會想起誰: (A)I-DOLL 陪吃娃娃|科技創業與營運實務sardinesaying
 
30T.ppt【国外大学文凭样本】TWU毕业证认证Q/微:892798920办西三一大学毕业证留信留服使馆公证,TWU硕士毕业证,TWU研究生毕业证,文凭...
30T.ppt【国外大学文凭样本】TWU毕业证认证Q/微:892798920办西三一大学毕业证留信留服使馆公证,TWU硕士毕业证,TWU研究生毕业证,文凭...30T.ppt【国外大学文凭样本】TWU毕业证认证Q/微:892798920办西三一大学毕业证留信留服使馆公证,TWU硕士毕业证,TWU研究生毕业证,文凭...
30T.ppt【国外大学文凭样本】TWU毕业证认证Q/微:892798920办西三一大学毕业证留信留服使馆公证,TWU硕士毕业证,TWU研究生毕业证,文凭...ggbob1
 
1.💥黑客接单,挑战你的想象力! 🚀💡从最炫酷的黑科技到神秘莫测的代码世界,这里都是你想要的技术。无论是破解密码、入侵系统还是开发软件,我们都能帮你实现!...
1.💥黑客接单,挑战你的想象力! 🚀💡从最炫酷的黑科技到神秘莫测的代码世界,这里都是你想要的技术。无论是破解密码、入侵系统还是开发软件,我们都能帮你实现!...1.💥黑客接单,挑战你的想象力! 🚀💡从最炫酷的黑科技到神秘莫测的代码世界,这里都是你想要的技术。无论是破解密码、入侵系统还是开发软件,我们都能帮你实现!...
1.💥黑客接单,挑战你的想象力! 🚀💡从最炫酷的黑科技到神秘莫测的代码世界,这里都是你想要的技术。无论是破解密码、入侵系统还是开发软件,我们都能帮你实现!...黑客 接单【TG/微信qoqoqdqd】
 
我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...
我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...
我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...黑客 接单【TG/微信qoqoqdqd】
 
🎉一键更改成绩单,轻松点亮你的未来! 💡[书]想知道自己成绩怎么样?别担心!我们来帮您解答疑惑。 在这里,只需轻轻一点按钮,就能立即查看到分数、排名和其他...
🎉一键更改成绩单,轻松点亮你的未来! 💡[书]想知道自己成绩怎么样?别担心!我们来帮您解答疑惑。 在这里,只需轻轻一点按钮,就能立即查看到分数、排名和其他...🎉一键更改成绩单,轻松点亮你的未来! 💡[书]想知道自己成绩怎么样?别担心!我们来帮您解答疑惑。 在这里,只需轻轻一点按钮,就能立即查看到分数、排名和其他...
🎉一键更改成绩单,轻松点亮你的未来! 💡[书]想知道自己成绩怎么样?别担心!我们来帮您解答疑惑。 在这里,只需轻轻一点按钮,就能立即查看到分数、排名和其他...黑客 接单【TG/微信qoqoqdqd】
 
加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制
加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制
加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制bairnshajjes
 
1.🔥承接黑客破解任务,你的难题我们来解决! 💡无论你是游戏玩家、企业用户还是个人用户,都能在这里找到满意的解决方案。 💪经验丰富的专业团队为您提供全方位...
1.🔥承接黑客破解任务,你的难题我们来解决! 💡无论你是游戏玩家、企业用户还是个人用户,都能在这里找到满意的解决方案。 💪经验丰富的专业团队为您提供全方位...1.🔥承接黑客破解任务,你的难题我们来解决! 💡无论你是游戏玩家、企业用户还是个人用户,都能在这里找到满意的解决方案。 💪经验丰富的专业团队为您提供全方位...
1.🔥承接黑客破解任务,你的难题我们来解决! 💡无论你是游戏玩家、企业用户还是个人用户,都能在这里找到满意的解决方案。 💪经验丰富的专业团队为您提供全方位...黑客 接单【TG/微信qoqoqdqd】
 
保分服务在SAT考试作弊问题上的应对策略和措施是否充分,如何确保服务的可靠性??
保分服务在SAT考试作弊问题上的应对策略和措施是否充分,如何确保服务的可靠性??保分服务在SAT考试作弊问题上的应对策略和措施是否充分,如何确保服务的可靠性??
保分服务在SAT考试作弊问题上的应对策略和措施是否充分,如何确保服务的可靠性??testhelper Sobrenome
 

Recently uploaded (14)

Grade 6 Lesson 7 Environment Protection.pptx
Grade 6 Lesson 7 Environment Protection.pptxGrade 6 Lesson 7 Environment Protection.pptx
Grade 6 Lesson 7 Environment Protection.pptx
 
003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdf
003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdf003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdf
003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdf
 
JAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptx
JAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptxJAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptx
JAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptx
 
未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制
未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制
未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制
 
【国外大学文凭样本】多大毕业证认证Q/微:892798920办多伦多大学毕业证留信留服使馆公公证,多大硕士毕业证,U of T研究生毕业证,文凭,改U o...
【国外大学文凭样本】多大毕业证认证Q/微:892798920办多伦多大学毕业证留信留服使馆公公证,多大硕士毕业证,U of T研究生毕业证,文凭,改U o...【国外大学文凭样本】多大毕业证认证Q/微:892798920办多伦多大学毕业证留信留服使馆公公证,多大硕士毕业证,U of T研究生毕业证,文凭,改U o...
【国外大学文凭样本】多大毕业证认证Q/微:892798920办多伦多大学毕业证留信留服使馆公公证,多大硕士毕业证,U of T研究生毕业证,文凭,改U o...
 
GPA低怎么办? | 身份黑后回复方案 | 出入境激活 身份恢复美本GPA太低了怎么办黑客服务,黑客修改大学成绩,黑客改成绩单,黑客入侵教务系统,找黑客修...
GPA低怎么办? | 身份黑后回复方案 | 出入境激活 身份恢复美本GPA太低了怎么办黑客服务,黑客修改大学成绩,黑客改成绩单,黑客入侵教务系统,找黑客修...GPA低怎么办? | 身份黑后回复方案 | 出入境激活 身份恢复美本GPA太低了怎么办黑客服务,黑客修改大学成绩,黑客改成绩单,黑客入侵教务系统,找黑客修...
GPA低怎么办? | 身份黑后回复方案 | 出入境激活 身份恢复美本GPA太低了怎么办黑客服务,黑客修改大学成绩,黑客改成绩单,黑客入侵教务系统,找黑客修...
 
【創業簡報練習】當一個人吃飯會想起誰: (A)I-DOLL 陪吃娃娃|科技創業與營運實務
【創業簡報練習】當一個人吃飯會想起誰:(A)I-DOLL 陪吃娃娃|科技創業與營運實務【創業簡報練習】當一個人吃飯會想起誰:(A)I-DOLL 陪吃娃娃|科技創業與營運實務
【創業簡報練習】當一個人吃飯會想起誰: (A)I-DOLL 陪吃娃娃|科技創業與營運實務
 
30T.ppt【国外大学文凭样本】TWU毕业证认证Q/微:892798920办西三一大学毕业证留信留服使馆公证,TWU硕士毕业证,TWU研究生毕业证,文凭...
30T.ppt【国外大学文凭样本】TWU毕业证认证Q/微:892798920办西三一大学毕业证留信留服使馆公证,TWU硕士毕业证,TWU研究生毕业证,文凭...30T.ppt【国外大学文凭样本】TWU毕业证认证Q/微:892798920办西三一大学毕业证留信留服使馆公证,TWU硕士毕业证,TWU研究生毕业证,文凭...
30T.ppt【国外大学文凭样本】TWU毕业证认证Q/微:892798920办西三一大学毕业证留信留服使馆公证,TWU硕士毕业证,TWU研究生毕业证,文凭...
 
1.💥黑客接单,挑战你的想象力! 🚀💡从最炫酷的黑科技到神秘莫测的代码世界,这里都是你想要的技术。无论是破解密码、入侵系统还是开发软件,我们都能帮你实现!...
1.💥黑客接单,挑战你的想象力! 🚀💡从最炫酷的黑科技到神秘莫测的代码世界,这里都是你想要的技术。无论是破解密码、入侵系统还是开发软件,我们都能帮你实现!...1.💥黑客接单,挑战你的想象力! 🚀💡从最炫酷的黑科技到神秘莫测的代码世界,这里都是你想要的技术。无论是破解密码、入侵系统还是开发软件,我们都能帮你实现!...
1.💥黑客接单,挑战你的想象力! 🚀💡从最炫酷的黑科技到神秘莫测的代码世界,这里都是你想要的技术。无论是破解密码、入侵系统还是开发软件,我们都能帮你实现!...
 
我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...
我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...
我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...
 
🎉一键更改成绩单,轻松点亮你的未来! 💡[书]想知道自己成绩怎么样?别担心!我们来帮您解答疑惑。 在这里,只需轻轻一点按钮,就能立即查看到分数、排名和其他...
🎉一键更改成绩单,轻松点亮你的未来! 💡[书]想知道自己成绩怎么样?别担心!我们来帮您解答疑惑。 在这里,只需轻轻一点按钮,就能立即查看到分数、排名和其他...🎉一键更改成绩单,轻松点亮你的未来! 💡[书]想知道自己成绩怎么样?别担心!我们来帮您解答疑惑。 在这里,只需轻轻一点按钮,就能立即查看到分数、排名和其他...
🎉一键更改成绩单,轻松点亮你的未来! 💡[书]想知道自己成绩怎么样?别担心!我们来帮您解答疑惑。 在这里,只需轻轻一点按钮,就能立即查看到分数、排名和其他...
 
加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制
加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制
加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制
 
1.🔥承接黑客破解任务,你的难题我们来解决! 💡无论你是游戏玩家、企业用户还是个人用户,都能在这里找到满意的解决方案。 💪经验丰富的专业团队为您提供全方位...
1.🔥承接黑客破解任务,你的难题我们来解决! 💡无论你是游戏玩家、企业用户还是个人用户,都能在这里找到满意的解决方案。 💪经验丰富的专业团队为您提供全方位...1.🔥承接黑客破解任务,你的难题我们来解决! 💡无论你是游戏玩家、企业用户还是个人用户,都能在这里找到满意的解决方案。 💪经验丰富的专业团队为您提供全方位...
1.🔥承接黑客破解任务,你的难题我们来解决! 💡无论你是游戏玩家、企业用户还是个人用户,都能在这里找到满意的解决方案。 💪经验丰富的专业团队为您提供全方位...
 
保分服务在SAT考试作弊问题上的应对策略和措施是否充分,如何确保服务的可靠性??
保分服务在SAT考试作弊问题上的应对策略和措施是否充分,如何确保服务的可靠性??保分服务在SAT考试作弊问题上的应对策略和措施是否充分,如何确保服务的可靠性??
保分服务在SAT考试作弊问题上的应对策略和措施是否充分,如何确保服务的可靠性??
 

Java cpu

  • 1. 了解CPU 作者:周忱 | 淘宝综合业务 微博:@MinZhou 邮箱:zhouchen.zm@taobao.com
  • 2. 为什么Java程序员也需要了解CPU 关于我 • 花名:周忱(chén) • 真名:周敏 • 微博: @MinZhou • Twitter: @minzhou • 2010年6月加入淘宝 • 曾经淘宝Hadoop&Hive研发 组Leader • 目前专注分布式实时计算 • Hive Contributor • 自由、开源软件热爱者 Taobao Java Team | zhouchen.zm
  • 3. 为什么Java程序员也需要了解CPU 关于我 • 花名:周忱(chén) • 真名:周敏 • 微博: @MinZhou • Twitter: @minzhou • 2010年6月加入淘宝 • 曾经淘宝Hadoop&Hive研发 组Leader • 目前专注分布式实时计算 • Hive Contributor • 自由、开源软件热爱者 Taobao Java Team | zhouchen.zm
  • 4. 为什么Java程序员也需要了解CPU 什么是volatile? Taobao Java Team | zhouchen.zm
  • 5. 为什么Java程序员也需要了解CPU Puzzle 1 下面哪个程序跑得更快? private static long value; private static volatile long value; public static void increment() { public static void increment() { while (value < 100000000L) { while (value < 100000000L) { value++; value++; } } } } 如果换成AtomicLong呢? Taobao Java Team | zhouchen.zm
  • 6. 为什么Java程序员也需要了解CPU Puzzle 2 下面哪个程序跑得更快? AtomicIntegerFieldUpdater state = … AtomicIntegerFieldUpdater state= … public void lock() { public void lock() { while(state.getAndSet(true)) {} ; //spin while (true) { } while(state.get()) {}; //spin if(!state.getAndSet(true)) return; } } 如果换成多线程呢? Taobao Java Team | zhouchen.zm
  • 7. 为什么Java程序员也需要了解CPU Intel 十年计划:Tick-Tock Taobao Java Team | zhouchen.zm
  • 8. 为什么Java程序员也需要了解CPU CPU微架构变革 • Hyper-threading • 32KB L1d 与32KB L1i • 256KB L2 Cache • 4–12 MB L3 cache • QPI 代替FSB • PCI E和DMI整合入 处理器, 北桥消失 • 支持 2/3通道DDR3 Taobao Java Team | zhouchen.zm
  • 9. 为什么Java程序员也需要了解CPU 现代CPU微架构 Taobao Java Team | zhouchen.zm
  • 10. 为什么Java程序员也需要了解CPU Intel Nehalem 排布 Taobao Java Team | zhouchen.zm
  • 11. 为什么Java程序员也需要了解CPU Intel Sandy Bridge Taobao Java Team | zhouchen.zm
  • 12. 为什么Java程序员也需要了解CPU Puzzle 3 下面哪个程序跑得更快? private static long[][] longs; private static long[][] longs; for (int i = 0; i < DIMENSION_1; i++) { for (int j = 0; j < DIMENSION_2; j++) { for (int j = 0; j < DIMENSION_2; j++) { for (int i = 0; i < DIMENSION_1; i++){ sum += longs[i][j]; sum += longs[i][j]; } } } } Taobao Java Team | zhouchen.zm
  • 13. 为什么Java程序员也需要了解CPU CPU Cache cat /sys/devices/system/cpu/cpu0/cache/index0/* Taobao Java Team | zhouchen.zm
  • 14. 为什么Java程序员也需要了解CPU Cache Coherence & MESI协议 • M: 修改 • E : 独占 • S : 共享 • I : 失效 发音: messy Taobao Java Team | zhouchen.zm
  • 15. 为什么Java程序员也需要了解CPU Puzzle 4 下面程序有什么问题? public final static class VolatileLong { longs = new VolatileLong[NUM_THREADS]; public volatile long value = 0L; for (int i = 0; i < longs.length; i++) { } longs[i] = new VolatileLong(); } public class FS implements Runnable { // 每个线程更新独立的变量 public void run() { for (int i = 0; i < NUM_THREADS; i++) { long i = ITERATIONS + 1; threads[i] = new Thread(new FS(i))); while (0 != --i) { } longs[arrayIndex].value = i; for (Thread t : threads) { } t.start(); } } } for (Thread t : threads) { t.join(); } Taobao Java Team | zhouchen.zm
  • 16. 为什么Java程序员也需要了解CPU False Sharing public final static class VolatileLong { public volatile long value = 0L; } => public final static class VolatileLong { public volatile long value = 0L; public long p1, p2, p3, p4, p5, p6; } Taobao Java Team | zhouchen.zm
  • 17. 为什么Java程序员也需要了解CPU False Sharing public final static class VolatileLong { public volatile long value = 0L; } => public final static class VolatileLong { public volatile long value = 0L; public long p1, p2, p3, p4, p5, p6; } Taobao Java Team | zhouchen.zm
  • 18. 为什么Java程序员也需要了解CPU False Sharing public final static class VolatileLong { public volatile long value = 0L; } => public final static class VolatileLong { public volatile long value = 0L; public long p1, p2, p3, p4, p5, p6; } Taobao Java Team | zhouchen.zm
  • 19. 为什么Java程序员也需要了解CPU Cache Consistency & 乱序执行 • CPU指令重排序 • 编译重排序 Taobao Java Team | zhouchen.zm
  • 20. 为什么Java程序员也需要了解CPU Memory Ordering • 程序顺序(Program ordering): 读写和指令编制一致, 也称强顺序. • 处理器顺序(Processor ordering): 加快指令执行速度, 例如读可跨越它之前 的buffered写 • Intel386及之前内存顺序模型: 程序顺序 • Pentium和Intel486内存顺序模型:大多数情况下遵循程序顺序 • P6及以后内存顺序模型:处理器顺序, 同时提供其它加强或弱化内存顺序 模型的特殊指令 Taobao Java Team | zhouchen.zm
  • 21. 为什么Java程序员也需要了解CPU 内存屏障 • Load Buffer • Store Buffer • CPU串行化指令 – CPUID – SFENCE – LFENCE – MFENCE • Lock系指令 Taobao Java Team | zhouchen.zm
  • 22. 为什么Java程序员也需要了解CPU Java内存模型 • Happens-Before // Lock • StoreStore pthread_mutex_lock(&lock); • LoadStore sequence = i; pthread_cond_signal(&condition); • StoreLoad pthread_mutex_unlock(&lock); • LoadLoad • Full Fence // Soft Barrier • 锁和synchronized块 asm volatile(“” ::: “memory”); • volatile 关键字 sequence = i; • final 关键字 // Fence asm volatile(“” ::: “memory”); sequence = i; asm volatile(“lock addl $0x0,(%rsp)”); Taobao Java Team | zhouchen.zm
  • 23. 为什么Java程序员也需要了解CPU Java内存模型 需要内存屏 重排序 次操作 次操作 障 Normal Volatile Volatile Volatile Load Load Store Normal Normal Load Volatile 首操作 首操作 Normal Monitor Monitor Load Store MonitorEnt Store er Store Enter Exit Normal Normal Load LoadStore Load No Normal Normal Store StoreStore Store Volatile Load Volatile Load No No No LoadLoad LoadStore LoadLoad LoadStore MonitorEnter Monitor Enter Volatile store Volatile Store No No StoreLoad StoreStore Monitor MonitorExit Exit Taobao Java Team | zhouchen.zm
  • 24. 为什么Java程序员也需要了解CPU Example 1. class X { $ java -XX:+UnlockDiagnosticVMOptions -XX:PrintAssemblyOptions=hsdis-print-bytes - 2. int a, b; XX:CompileCommand=print,X.f X 3. volatile int v, u; 4. void f() { … 5. int i, j; 6. 7. i = a; // load a [Verified Entry Point] 8. j = b; // load b 0xb3a1e28c: push %ebp ;...55 9. i = v; // load v 0xb3a1e28d: sub $0x8,%esp ;...81ec0800 0000 10. // LoadLoad 0xb3a1e293: mov 0x10(%ecx),%ebx ;...8b5910 ; i = v 11. j = u; // load u 0xb3a1e296: mov 0x14(%ecx),%edi ;...8b7914 ; j = u 12. // LoadStore 0xb3a1e299: mov %ebx,0x8(%ecx) ;...895908 ; a = i 13. a = i; // store a 0xb3a1e29c: mov %edi,0xc(%ecx) ;...89790c ;b=j 14. b = j; // store b 0xb3a1e29f: mov %ebx,0x10(%ecx) ;...895910 ; v = i 15. // StoreStore 0xb3a1e2a2: mov %edi,0x14(%ecx) ;...897914 ; u = j 16. v = i; // store v 0xb3a1e2a5: lock addl $0x0,(%esp) ;...f0830424 ; memory barrier 17. // StoreStore 0xb3a1e2aa: mov 0x14(%ecx),%ebp ;...8b6914 ; i = u 18. u = j; // store u 19. // StoreLoad 0xb3a1e2ad: mov %ebp,0x8(%ecx) ;...896908 ; a = i 20. i = u; // load u 0xb3a1e2b0: add $0x8,%esp ;...83c408 21. // LoadLoad 0xb3a1e2b3: pop %ebp ;...5d 22. // LoadStore 0xb3a1e2b4: test %eax,0xb78ab000 ;...850500b0 8ab7 23. j = b; // load b 24. a = i; // store a … 25. } 26.} 参考: jdk/hotspot/src/os_cpu/linux_x86/vm/orderAccess_linux_x86.inline.hpp Taobao Java Team | zhouchen.zm
  • 25. 为什么Java程序员也需要了解CPU Puzzle 5 为什么有volatile还需要AtomicXX及 Unsafe.compareAndSwapXX? Taobao Java Team | zhouchen.zm
  • 26. 为什么Java程序员也需要了解CPU 原子指令 • CompareAndSwap: LOCK XCHG • LOCK XADD • ABA问题 Taobao Java Team | zhouchen.zm
  • 27. 为什么Java程序员也需要了解CPU 让步锁 public class BackoffLock { if (!state.getAndSet(true)) { private AtomicBoolean state = new return; AtomicBoolean(false); } else { private static final int MIN_DELAY = ...; backoff.backoff(); private static final int MAX_DELAY = ...; } } public void lock() { } Backoff backoff = new Backoff(MIN_DELAY, MAX_DELAY); public void unlock() { while (true) { state.set(false); while (state.get()) {}; } } Taobao Java Team | zhouchen.zm
  • 28. 为什么Java程序员也需要了解CPU 队列锁 • BackOff锁的问题 – Cache-coherence Traffic – 临界区利用率 – 公平性问题 – 饥饿 • 基于数组的队列 • CLH队列 • MCS队列 • NUMA-Aware变种 https://blogs.oracle.com/dave/entry/flat_combining_numa_locks Taobao Java Team | zhouchen.zm
  • 29. 为什么Java程序员也需要了解CPU Puzzle 6 为什么j.u.c或者jvm里面在加锁的时候, 喜欢用先 CAS spin尝试N次, 如果失败则yield多次(可选), 如果 最后还是失败则park, 同时把线程加到队列里? Taobao Java Team | zhouchen.zm
  • 30. 为什么Java程序员也需要了解CPU 工具 • top • vmstat • lscpu • perf • Valgrind tools suite • OProfile • SystemTap • numactl • Intel Vtune • MAT Taobao Java Team | zhouchen.zm
  • 31. 为什么Java程序员也需要了解CPU 推荐读物 • What every programmer should know about memory • Intel® 64 and IA-32 Architectures Software Developer Manuals • The Art of Multiprocessor Programming • The JSR-133 Cookbook for Compiler Writers (Java Memory Model) • 本人博客: http://coderplay.javaeye.com Taobao Java Team | zhouchen.zm
  • 32. 为什么Java程序员也需要了解CPU Q&A 作者:周忱 | 淘宝综合业务 微博:@MinZhou 邮箱:zhouchen.zm@taobao.com Taobao Java Team | zhouchen.zm