中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

從構建分布式秒殺系統聊聊為什么不用synchronized

發布時間:2020-03-23 00:06:40 來源:網絡 閱讀:397 作者:Java_老男孩 欄目:編程語言

前言

技術沒有高低之分,適合自己的就是最好的。只有努力擴展自己的知識邊界,才能探索更多未知領域。

案例

在分析為什么不用 synchronized 這個問題之前,我們先用代碼說話,LockDemo 測試案例:

/**
 * 案例測試
 * @author 
 */
public class LockDemo {

    private static Lock lock = new ReentrantLock();

    private static int num1 = 0;
    private static int num2 = 0;
    public static void main(String[] args) {
        lockDemo();
        SyncDemo();
    }
    /**
     * 本機測試下20萬自增基本能確定性能,但是不是特別明顯,50萬差距還是挺大的
     * 20萬以下數據synchronized優于Lock
     * 20萬以上數據Lock優于synchronized
     */
    public static void lockDemo(){
        long start = System.currentTimeMillis();
        for(int i=0;i<500000;i++){
            final int num = i;
            new Runnable() {
                @Override
                public void run() {
                    lock(num);
                }
            }.run();
        }
        long end = System.currentTimeMillis();
        System.out.println("累加:"+num1);
        System.out.println("ReentrantLock鎖:"+ (end-start));
    }
    public static void SyncDemo(){
        long start = System.currentTimeMillis();
        for(int i=0;i<500000;i++){
            final int num = i;
            new Runnable() {
                @Override
                public void run() {
                    sync(num);
                }
            }.run();
        }
        long end = System.currentTimeMillis();
        System.out.println("累加:"+num2);
        System.out.println("synchronized鎖:"+ (end-start));
    }
    public static void lock(int i){
        lock.lock();
        num1 ++;
        lock.unlock();
    }
    public static synchronized void sync(int i){
        num2 ++;
    }
}

50萬++測試數據:

累加:500000
ReentrantLock鎖:20
累加:500000
synchronized鎖:28

用數據說話,很明顯在高并發下,ReentrantLock 的性能是要優于 synchronized 的,雖然僅僅是幾毫秒的差距,當然這里我并沒有對比CPU的使用情況。

10萬++測試數據:

累加:100000
ReentrantLock鎖:13
累加:100000
synchronized鎖:8

分析

這時候小伙伴可能會問了,有沒有一個準確的臨界值,來區分使用這兩種鎖?當然,在回答這個問題之前,先了解一下這兩種鎖到底有何異同。

鎖的實現

Synchronized是依賴于JVM實現的,表現為原生語法層面的互斥鎖。開發者是無法直接看到相關源碼,但是我們可以通過利用javap工具查看生成的class文件信息來分析Synchronize的實現。同步代碼塊是使用monitorenter和monitorexit指令實現的,同步方法依靠的是方法修飾符上的ACC_SYNCHRONIZED實現。

ReenTrantLock是基于JDK實現的,一個表現為API層面的互斥鎖,開發人員通過查閱源碼就可以了解到。

可重入性

ReenTrantLock 的字面意思就是再進入的鎖,synchronized關鍵字所使用的鎖也是可重入的,兩者關于這個的區別不大。

功能區別

Synchronized的使用比較方便,不需要開發者手動加鎖和釋放鎖,而ReenTrantLock需要手工聲明來加鎖和釋放鎖(lock() 和 unlock() 方法配合 try/finally 語句塊來實現)

ReenTrantLock 在鎖的細粒度和靈活度上要優于Synchronized。此外,還增加了一些高級特性,主要有以下3項:等待可中斷、可實現公平鎖以及鎖可以綁定多個條件。

發展歷史

關于synchronized 與ReentrantLock

在JDK 1.6之后,虛擬機對于synchronized關鍵字進行整體優化后,在性能上synchronized與ReentrantLock已沒有明顯差距,因此在使用選擇上,需要根據場景而定,大部分情況下我們依然建議是synchronized關鍵字,原因之一是使用方便語義清晰,二是性能上虛擬機已為我們自動優化。而ReentrantLock提供了多樣化的同步特性,如超時獲取鎖、可以被中斷獲取鎖(synchronized的同步是不能中斷的)、等待喚醒機制的多個條件變量(Condition)等,因此當我們確實需要使用到這些功能是,可以選擇ReentrantLock

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乐安县| 北碚区| 蕲春县| 尼玛县| 岳普湖县| 东至县| 缙云县| 固阳县| 平乡县| 纳雍县| 宁晋县| 修文县| 台中县| 当涂县| 泾川县| 大同县| 芜湖市| 中江县| 象州县| 北辰区| 成安县| 彭泽县| 改则县| 水城县| 周口市| 池州市| 大名县| 长垣县| 阳新县| 锡林浩特市| 井研县| 六枝特区| 安义县| 泗洪县| 特克斯县| 上思县| 乌兰察布市| 息烽县| 库伦旗| 罗源县| 宣威市|