JAVA併發程式設計之基本概念
阿新 • • 發佈:2018-11-09
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規則
待補充。。。