1. 程式人生 > >JAVA併發程式設計之基本概念

JAVA併發程式設計之基本概念

1、鎖是對物件訪問的時候,通過對物件加鎖,防止並行訪問的控制手段;對物件加鎖成功,代表我持有這個物件的監視器,解鎖,代表釋放了這個物件的監視器。

拿到物件的監視器,肯定是對物件加鎖成功的;對物件加鎖成功 ,程式可以主動Watiing或者Time_waiting在物件監視器上。

2、鎖與監視器區別

參見以下兩篇文章 Java鎖和監視器  java-jvm-jstack-(監視器和鎖的概念)

3、同步佇列與等待佇列

簡單的理解是同步佇列存放著競爭同步資源的執行緒的引用(不是存放執行緒),而等待佇列存放著待喚醒的執行緒的引用。

在Object的監視器模型中,一個物件擁有一個同步佇列和一個等待佇列,而併發包中的Lock(更確切的說是同步器AQS)擁有一個同步佇列和多個等待佇列。

4、非公平鎖和公平鎖

公平鎖模式,是根據FIFO規則,在同步佇列中,依據執行緒等待鎖的時間長短,也就是頭結點的下一個節點獲取到鎖。

非公平鎖模式,一個執行緒在釋放鎖之後,ReentrantLock類從同步佇列中怎麼決定哪個執行緒可以獲取到鎖的?非公平鎖的非公平體性體現在一個執行緒會首先嚐試獲取同步狀態,不管同步佇列是否有執行緒在排隊,這就有可能在其他執行緒釋放鎖後,當前執行緒比同步佇列中的執行緒先獲取到鎖。

以Semaphore類說明:
1、//非公平鎖,在獲取同步狀態時,直接嘗試獲取同步狀態,如果獲取同步狀態成功,則獲取到鎖。注意,非公平鎖的執行緒並沒有判斷當前同步佇列是否有節點。
final int nonfairTryAcquireShared(int acquires) {
            for (;;) {
                int available = getState();
                int remaining = available - acquires;
                if (remaining < 0 ||
                    compareAndSetState(available, remaining))
                    return remaining;
            }
        }
2、//公平鎖,在獲取同步狀態時,先判斷當前同步佇列是否有節點,如果有存在等待的節點,則返回-1,表示獲取鎖失敗
protected int tryAcquireShared(int acquires) {
            for (;;) {
                if (hasQueuedPredecessors())//查詢是否有執行緒正在等待獲取鎖。
                    return -1;
                int available = getState();
                int remaining = available - acquires;
                if (remaining < 0 ||
                    compareAndSetState(available, remaining))
                    return remaining;
            }
        }

5、happen-before規則

待補充。。。