synchronized 和 Lock用法

大家有時候都會碰到的問題。例如,有些代碼需避免主線程阻塞需要異步處理,開子線程實現。但是開啓子線程之後有可能會碰到併發資源共享的問題,所以線程與鎖是緊密相關的。下面是我從網上搜索的資料總結一下java鎖synchronizedLock的一些區別,如有不當,請告知,謝謝。

一般我們會將鎖分爲對象鎖類鎖,兩個鎖是有很大差別的,對象鎖是作用在實例方法或者一個對象實例上面的,而類鎖是作用在靜態方法或者Class對象上面的。synchronized不具有繼承性。

synchronized的用法

  • 對象鎖
    對象鎖是作用在實例方法或者一個對象實例上面的
    作用在對象實例的方法上
pubilc synchronized void test() {}

用在對象實例的代碼塊上

public void test() {
     synchronized(obj) {
         //code
     }
}
  • 類鎖
    類鎖是作用在靜態方法或者Class對象上面的
pubilc synchronized static void test() {}

Lock的用法

ReentrantLock 與synchronized有相同的併發性和內存語義,還包含了中斷鎖等候和定時鎖等候,意味着線程A如果先獲得了對象obj的鎖,那麼線程B可以在等待指定時間內依然無法獲取鎖,那麼就會自動放棄該鎖。
synchronized是在JVM層面實現的,因此係統可以監控鎖的釋放與否,而ReentrantLock使用代碼實現的,系統無法自動釋放鎖,需要在代碼中finally子句中顯式釋放鎖lock.unlock();
用法如下:

    private Lock lock;
    private void test(){
        try{
            lock.lock();
            //code...
        } catch (Exception e){
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

總結

  • 在併發量比較小的情況下,使用synchronized是個不錯的選擇,但是在併發量比較高的情況下,其性能下降很嚴重,此時ReentrantLock是個不錯的方案

參考文章
https://www.cnblogs.com/benshan/p/3551987.html
https://www.cnblogs.com/wangyayun/p/6593446.html
https://blog.csdn.net/zhujiangtaotaise/article/details/55509939

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章