1. 程式人生 > >簡單測試Java執行緒安全中阻塞同步與非阻塞同步效能

簡單測試Java執行緒安全中阻塞同步與非阻塞同步效能

摘抄自周志明老師的《深入理解Java虛擬機器:JVM高階特性與最佳實踐》13.2.2 執行緒安全的實現方法

1.名詞解釋

同步是指鎖哥執行緒併發訪問共享資料時,保證共享資料同一時刻只被一個執行緒訪問

互斥同步(阻塞同步)是一種悲觀的併發策略,總是認為只要不去做正確的同步措施(加鎖),那就肯定會出現問題。

阻塞同步最主要的問題是進行執行緒阻塞和喚醒所帶來的效能問題,因為在JDK 1.2之後,Java的執行緒模型被替換為基於作業系統原生執行緒模型來實現,如要阻塞喚醒一個執行緒,都需要作業系統來幫忙完成,這就需要使用者態轉換到核心態,會耗費很多時間。

非阻塞同步:隨著硬體指令集的發展,我們有了另一種選擇:基於衝突檢測的樂觀併發策略,這種操作不需要掛起執行緒,會節省很多時間,比如CAS(compare and swap)指令。

2.開始測試

第一種加鎖方式:

    static int a=0;
    public static void lock() {
        Thread[] threads=new Thread[50];
        for(int i=0;i<threads.length;i++){
            threads[i]=new Thread(new Runnable() {
                
                @Override
                public void run() {
                    
for(int i=0;i<100000;i++){ synchronized(Main.class){ a++; } } } }); threads[i].start(); } while(Thread.activeCount() > 1){ Thread.yield(); } System.out.println(a); }

第二種CAS方式:

    static AtomicInteger integer=new AtomicInteger(0);
    public static void cas() {
        Thread[] threads=new Thread[50];
        for(int i=0;i<threads.length;i++){
            threads[i]=new Thread(new Runnable() {
                
                @Override
                public void run() {
                    for(int i=0;i<100000;i++){
                        integer.incrementAndGet();
                    }
                }
            });
            threads[i].start();
        }
        while(Thread.activeCount() > 1){
            Thread.yield();
        }
        System.out.println(integer.get());
    }

3結論:執行兩個方法,同樣是50個執行緒,100000個自增,輸出時間差,可以看到效能之間的差異。

lock方法平均在1270ms

cas方法平均在175ms

可以看到阻塞同步與非阻塞同步之間巨大的差異,也可以看出Java執行緒使用者態核心態切換損耗的處理器時間很大。

相關推薦

簡單測試Java執行安全阻塞同步阻塞同步效能

摘抄自周志明老師的《深入理解Java虛擬機器:JVM高階特性與最佳實踐》13.2.2 執行緒安全的實現方法 1.名詞解釋 同步是指鎖哥執行緒併發訪問共享資料時,保證共享資料同一時刻只被一個執行緒訪問 互斥同步(阻塞同步)是一種悲觀的併發策略,總是認為只要不去做正確的同步措施(加鎖),那就肯定會出現問題。 阻塞

簡單測試Java線程安全阻塞同步阻塞同步性能

訪問 完成 老師 system 測試 int oid 1.2 run 摘抄自周誌明老師的《深入理解Java虛擬機:JVM高級特性與最佳實踐》13.2.2 線程安全的實現方法 1.名詞解釋 同步是指鎖哥線程並發訪問共享數據時,保證共享數據同一時刻只被一個線程訪問 互斥同步(阻

Java執行安全

執行緒不安全的類: HashMap LinkedHashMap TreeMap ArrayList LinkedList HashSet TreeSet LinkedHashSet StringBuilder 執行緒安全的類: ConcurrentHashMap Hasht

java執行以程式碼的順序執行,主要是記錄一下繼承執行池的內容

1.這個是自定義的執行緒池類,直接上程式碼 package org.jimmy.threadtest20181121; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ThreadPoolExecut

Java執行安全執行開發

網際網路上充斥著對Java多執行緒程式設計的介紹,每篇文章都從不同的角度介紹並總結了該領域的內容。但大部分文章都沒有說明多執行緒的實現本質,沒能讓開發者真正“過癮”。 從Java的執行緒安全鼻祖內建鎖介紹開始,讓你瞭解內建鎖的實現邏輯和原理以及引發的效能問題,接著說明了Java多執行緒程式設計中鎖的存在是為

Java執行submit()和execute之間的區別?

一: submit()方法,可以提供Future < T > 型別的返回值。 executor()方法,無返回值。 execute無返回值 public void execute(Runnable command) { if (command == null)

Java執行的核心執行是如何被重複利用的

在Java開發中,經常需要建立執行緒去執行一些任務,實現起來也非常方便,但如果併發的執行緒數量很多,並且每個執行緒都是執行一個時間很短的任務就結束了,這樣頻繁建立執行緒就會大大降低系統的效率,因為頻繁建立執行緒和銷燬執行緒需要時間。此時,我們很自然會想到使用執行緒池來解決這個問題。 使用執行緒池的好處

java執行安全問題

併發搶票過程中,如果不加同步鎖,就會出現執行緒不安全問題,導致程式碼執行結果出現嚴重問題。另外同一個執行緒啟動多次是不允許的。package sx.test.thread;public class TicketDemo {public static void main(Str

Java-執行安全

Java-執行緒安全 0x01 什麼是執行緒安全 執行緒安全是針對某個物件來說,如果當多執行緒訪問此物件時,不用再用額外方式如同步鎖等,總能執行獲得正確結果,那就可以說這個物件程式碼執行緒安全。 0x02 Java中的執行緒安全 Java中執行緒安全強度由強到弱是: 不可

關於java執行安全問題

執行緒:負責一個程序中的程式碼執行。執行緒是程序中的一個執行路徑。 執行緒安全問題出現的根本原因:1. 存在著兩個或者兩個以上的執行緒。2. 多個執行緒共享了著一個資源, 而且操作資源的程式碼有多句。 執行緒安全問題的解決方案:1. 使用同步程式碼塊格式:synchroni

Java執行安全佇列Queue

在Java多執行緒應用中,佇列的使用率很高,多數生產消費模型的首選資料結構就是佇列。Java提供的執行緒安全的Queue可以分為阻塞佇列和非阻塞佇列,其中阻塞佇列的典型例子是BlockingQueue,非阻塞佇列的典型例子是ConcurrentLinkedQue

java執行安全之併發Queue(十三)

併發Queue        在併發的佇列上jdk提供了兩套實現,一個是以ConcurrentLinkedQueue為代表的高效能佇列,一個是以BlockingQueue介面為代表的阻塞佇列,無論在那種都繼承自Queue。 如圖繼承Queue共有二十四個:

java 執行安全的全域性計數器-AtomicInteger原子操作類

首先 , 測試一下正常程式碼 public class Test1 { public static int count = 0; public static void main(String[] args) { for (int i =

java執行安全之synchronized鎖重入及出現異常鎖自動釋放(五)

科技快訊       11月16日下午訊息,以“Bring AI to Life”為主題的2017百度世界大會今天在北京國貿大酒店和北京嘉裡大酒店舉行。愛奇藝創始人兼CEO龔宇在大會上發表了主題為“愛奇藝·更懂娛樂”的主題演講,龔宇表示愛奇藝對於科技的重視與百

如何等待java執行所有任務完成

一、等待執行緒池所有執行緒完成: 有時候我們需要等待java thread pool中所有任務完成後再做某些操作,如想要等待所有任務完成,僅需呼叫threadPool.awaitTermination

java執行安全的實現方法_筆記

閱讀《深入理解java虛擬機器》後的閱讀筆記。1、 互斥同步同步時指在多個執行緒併發訪問共享資料時,保證共享資料在同一個時刻只被一個(或者是一些,使用訊號量的時候)執行緒使用。而互斥是實現同步的一種手段,臨界區,互斥量和訊號量都是主要的互斥實現方式。  1.1 在java中最

java執行安全之併發Queue

關閉 原 java執行緒安全之併發Queue(十三) 2017年11月19日 23:40:23 小彬彬~ 閱讀數:12092更多

java執行安全的容器有哪些?

同步容器類:使用了synchronized 1.Vector 2.HashTable 併發容器: 3.ConcurrentHashMap:分段 4.CopyOnWriteArrayList:寫時複製 5.CopyOnWriteArraySet:寫時複製 Queue: 6.C

學習筆記之Java執行安全雜談(上)——執行安全概念和基本方案

執行緒安全問題絕對是併發開發中一個重點中的重點,這篇就來說說執行緒安全相關的一些問題。執行緒安全是什麼概念?這個概念說簡單也簡單,說複雜也複雜,“安全”的概念是什麼,用我個人的話說的淺顯些,就是類/物件本身在多執行緒併發執行的場景下,能夠保證程式的邏輯是可以接受的而不是被

Java執行安全佇列操作

題目如下: 使用 wait notify 實現一個佇列,佇列有2個方法,add 和 get 。add方法往佇列中新增元素,get方法往佇列中獲得元素。佇列必須是執行緒安全的。如果get執行時,佇列為空,執行緒必須阻塞等待,直到有佇列有資料。如果add時,佇列已