1. 程式人生 > >011 深入理解synchronized

011 深入理解synchronized

syn zed 重新 現在 概念 his span 四種 spa

一 .概述

在前面我們使用synchronized完成了一個原子方法的實現.現在我們需要深入的理解這個關鍵詞.


二 . 使用方式

  對於這個關鍵詞我們的使用方式有四種:

  [1]修飾普通方法

  [2]修飾靜態方法

  [3]對實例對象加互斥鎖

  [4]對類對象加互斥鎖

我們首先需要知道的就是synchronized就是使用互斥鎖的方式完成線程的同步,

    原理就是對於臨界資源的操作保持互斥.


三 . 實現方式

public synchronized void add1() {
            count ++;
        }
        
        
public static void add2() { count ++; } public void add3() { synchronized (this) { count ++ ; } } public static void add4() { synchronized (Test.class) { count ++; } }

上面的代碼之中,我們分別將synchronized關鍵詞放在了不同的地方使用,看起來使用的情況是比較復雜的.

  但是總結一些:

    synchronized就是完成了互斥鎖的概念,獲取到了鎖的線程可以運行,其它沒有獲取鎖的線程如搶不到鎖就進入

      block隊列之中.

  那麽:synchronized關鍵詞修飾實例方法就相當於是用當前調用方法的對象作為互斥鎖.

    修飾的靜態方法就相當於拿到class字節碼作為互斥鎖.


四 . 限制

  synchronized關鍵詞代表的互斥鎖的限制比較大,

    一旦一個線程由於搶奪鎖失敗就會進入阻塞隊列之中,需要等待鎖被重新釋放.

      如果那個搶占鎖的線程運行的時間很長,那麽互斥鎖的代價就太高了.

        因此JDK在後面引入了偏向鎖,自旋鎖來改進互斥鎖, 

          但是他們本質上都是互斥鎖,因此這個關鍵詞代表的互斥鎖是一種重量級別的鎖.

011 深入理解synchronized