Java線程安全解決方案(synchronized,ReentrantLock,Atomic使用場景描述)dockers-Cgroup資源分配配置與安全

因此讀取頻繁使用樂觀鎖,寫入頻繁使用悲觀鎖。php

且這個鎖能夠定義成公平鎖還能夠定義成非公平鎖。css

ReentrantLock使用場景:

ReentrantLock提供了多樣化的同步,好比有時間限制的同步,能夠被Interrupt的同步(synchronized的同步是不能Interrupt的)等 。html

/** * 線程安全的hashMap */ private static ConcurrentHashMap<string,string> hashMap = new ConcurrentHashMap<>(); public static void put(String key,String value){ hashMap.put(key,value); } public static String get(String key{ return hashMap.get(key); }

ConcurrentHashMap內部的實現是CAS的樂觀鎖,當鎖沒法取得會開始自旋,直到下一次取得鎖。緣由在於,編譯程序一般會盡量的進行優化synchronized,另外可讀性很是好,無論用沒用過5.0多線程包的程序員都能理解。前端

/** * synchronized用id */ private static volatile Long syncId=0L; /** * synchronized方式獲取id 同步方法 * @return */ public static synchronized Long getSyncId1(){ syncId++; return syncId; } /** * synchronized方式獲取id 同步代碼塊 * @return */ public static Long getSyncId2(){ synchronized (syncId){ syncId++; return syncId; } }

代碼可讀性強,畢竟是java的關鍵字,執行優先級高 。經常使用有java關鍵synchronized、由於他不能在多個Atomic之間同步。可是當同步很是激烈的時候,synchronized的性能一會兒能降低好幾十倍。vue

Atomic或者Concurrent使用場景:

和上面的相似,不激烈狀況下,性能比synchronized略遜,而激烈的時候,也能維持常態。java

/**     * ReentrantLock用id     */    private static volatile Long lockId=0L;    /**     * ReentrantLock公平鎖     */    private static final ReentrantLock reentrantLock = new ReentrantLock(true);    /**     *  ReentrantLock方式獲取id     * @return     */    public static Long getLockId(){        reentrantLock.lock();        try {            lockId++;            return lockId;        }catch (Exception e){            e.printStackTrace();            return getLockId();        }finally {            reentrantLock.unlock();        }    }

我這裏以公平鎖做爲演示對象。可重入鎖ReentrantLock,還有併發包下的Atomic或者Concurrent的安全類型。
在資源競爭激烈可使用其餘方式來加鎖 。在資源競爭不激烈的情形下,性能稍微比synchronized差點點。可是其有一個缺點,就是隻能同步一個值,一段代碼中只能出現一個Atomic的變量,多於一個同步無效。這時候就須要解決線程安全的問題,這時候就可使用java當中的鎖機制。node

/**     * Atomic用id     */    private static volatile AtomicLong atomicId=new AtomicLong(0L);    /**     * Atomic方式獲取id     * @return     */    public static Long getAtomicId(){        return  atomicId.addAndGet(1);    }

對於其餘類型的好比和Map和Set可使用用併發包下的ConcurrentHashMap和ConcurrentHashSet等線程安全的數據類型。能夠多對方法進行加鎖(同步方法),也能夠對對象進行加鎖(同步代碼快)。而ReentrantLock還能保證正常的性能。激烈的時候,Atomic的性能會優於ReentrantLock一倍左右。可是由於ReentrantLock是悲觀鎖,加鎖時會對資源進行加鎖,當讀取頻繁時性能會不如CAS的樂觀鎖。當從輕量級鎖到偏向鎖,再到一個重量級鎖。python

線程安全解決方案

synchronized,ReentrantLock,Atomic 使用場景描述

在實際開發過程當中若是服務量,請求頻繁,就會常常遇見併發,這時候不作處理就會出現不少非法數據。性能會大大的下降。mysql

synchronized使用場景:

在資源競爭不是很激烈的狀況下,偶爾出現併發,須要同步的情形下,synchronized是很合適的。react

ReentrantLock還能夠查看鎖的狀態, 鎖是否被鎖上了.
能夠查看當前有多少線程再等待鎖。
可是還有一個問題,當前資源競爭激烈時,對於部分線程遲遲獲取不到鎖,這時候會出現一個鎖升級的過程,且鎖升級的過程是不可逆的。synchronized關鍵字一放,就解決線程安全的問題。

 

相關文章

相關文章
相關標籤/搜索