public class OK { public static void main(String[] args) { int i=0; System.out.print(i); } public void OK(){} } lots of code
google-code-prettify
2015年3月19日 星期四
java
2015年2月25日 星期三
面對對象??
我觉得,这篇文章的例子举得太差了,差得感觉就像是OO的高级黑。面向对象编程注重的是:1)数据和其行为的打包封装,2)程序的接口和实现的解耦。你那怕,举一个多个开关和多个电器的例子,不然就像STL中,一个排序算法对多个不同容器的例子,都比这个例子要好得多得多。老实说,Java SDK里太多这样的东西了。
我以前给一些公司讲一些设计模式的培训课,我一再提到,那23个经典的设计模式和OO半毛钱关系没有,只不过人家用OO来实现罢了。
设计模式就三个准则:
1)中意于物件组合而不是物件继承,
2)依赖于接口
(實作介面程式--反轉控制→ 依賴注入--參數注入<只有函式有> or 屬性注入<類中有的>)
而不是实现 (個別類程式),
3)高内聚,低耦合。你看,这完全就是Unix的设计准则。
參考:
如此理解面向对象编程
http://coolshell.cn/articles/8745.html
Spring 的核心概念是 IoC,IoC 的抽象概念是「依賴關係的轉移」,像是
「高層模組不應該依賴低層模組,而是模組都必須依賴於抽象」是 IoC 的一種表現,
「實現必須依賴抽象,而不是抽象依賴實現」也是 IoC 的一種表現,
「應用程式不應依賴於容器,而是容器服務於應用程式」也是 IoC 的一種表現。
Spring 的核心概念是 IoC,IoC 的抽象概念是「依賴關係的轉移」,像是
「高層模組不應該依賴低層模組,而是模組都必須依賴於抽象」是 IoC 的一種表現,
「實現必須依賴抽象,而不是抽象依賴實現」也是 IoC 的一種表現,
「應用程式不應依賴於容器,而是容器服務於應用程式」也是 IoC 的一種表現。
2015年2月20日 星期五
semaphore (信號)
Semaphore原理與操作說明
作者/王宜倫
[發表日期:2012/5/5]
甚麼是semaphore (信號)
Semaphore是Edsger W. Dijkstra於1960年代末期所設計的一種程式設計架構。Semaphore是一個variable (變數)或是abstract data type (抽象資料型別),提供平行運算環境中,控制多個process (程序)或thread(執行緒)存取共享資源的能力,Semaphore可以用於紀錄某一特定資源剩下多少數目可使用;process或thread透過semaphore可以安全的使用共享資源,若特定資源已使用完時,會需要等待資源被釋放。雖然semaphore在防止deadlock或race condition方面是一個很有用的工具,但是程式使用semaphore運作上並無法保證一定不會遇到這些問題。
Semaphore包含兩種:binary semaphore(二進位信號)和counting semaphore(計數信號)。
一、binary semaphore(二進位信號)
binary semaphore值只能是0或1,在邏輯上相當於一個mutex(互斥鎖)。mutex使用上與binary semaphore具有相同功能,但是,mutex主要設計是防止兩個process同時間執行相同的一段code或存取同一資料,而binary semaphore設計上則是限制同時間存取同一資源;很多應用上mutex具有owner(擁有者)的概念,只有鎖住mutex的process,才具有解鎖的權限;相對的,semaphore並無此限制。
二、counting semaphore(計數信號)
counting semaphore值依據semaphore.h的SEM_VALUE_MAX (semvmx)定義。也有作業系統稱作general semaphore。
Semaphore的運作原理
Edsger W. Dijkstra的模型與鐵路操作有關:假設某段鐵路是單線的,因此,一次只允許一列火車通過;semaphore用於協調同步通過該軌道的火車,火車在進入單一軌道之前必須等待信號燈變為允許通行的狀態,火車進入軌道後,必須改變信號燈狀態,防止其他火車進入該軌道;火車離開這段軌道時,必須再次更改信號燈的狀態,以便允許其他火車進入軌道。
或是類似圖書館的研究室使用,假設有10間研究室(SEM_VALUE_MAX=10),若學生要使用研究室便需要向櫃檯申請,櫃檯會記錄有多少間研究室使用中,若10間研究室都被申請使用後,且仍有學生要申請使用,該學生必須等待有其他學生離開,空出研究室後,才能進入使用,該櫃檯就扮演semaphore的角色。
在電腦系統中,信號燈(semaphore)以整數來表示,可用兩種操作行為來說明:
一、V operation:V()會將semaphore的值加1,signal函數或是sem_post()。
二、P operation:P()會將semaphore的值減1,wait函數或是sem_wait()。
P和V的意義來自荷蘭文(Edsger W. Dijkstr為荷蘭人),V代表verhogen,其意思是增加,P代表portmanteau prolaag,其意思是嘗試減小。在P operation中,semaphore在減小之前必須為正,確保semaphore值不為負,並且比該值減小之前小1;在P和V operation中,必須在沒有干擾的情況下進行運算,亦即每個P或V operation必須具備atomic operation特性,該operation是不可分割的(all or nothing behavior)。
從semaphore概念上來說,counting semaphore為一個非負整數計數器,通常用來協調process或thread對共享資源的存取。semaphore value可用來表示可用資源的數目,可在初始化時將semaphore value設為可用資源的數目,然後,在使用資源時減1,在釋放資源時加1;若為負數時,表示資源不足,要存取共享資源的process或thread會被阻擋(block),需要等待semaphore value變為正整數時,才可存取共享資源。實務上,也可將semaphore初始值設為1,使用該資源時加1,釋放資源時減1,若無法再加1時(signal或post回傳-1),表示已無資源可使用,程式需針對此錯誤進行處理;部分作業系統當使用超過最大值時(SEM_VALUE_MAX)會發生overflow(溢位),變為負數,表示資源不足。
由於semaphore並無強制由同一個process或thread來獲取和釋放,因此semaphore可用於非同步事件通知;同時,由於semaphore包含狀態,因此可以非同步方式使用,而不用像條件變數那樣要求獲取mutex。但是,semaphore的效率不如mutex。
Semaphore可以是無名稱的(unnamed)或是有名稱的(named),unnamed semaphore可供單一process或不同process使用,依據初始化時設定決定,named semaphore則在不同process間同步共享資源。
Semaphore的使用
此章節以POSIX semaphore來說明semaphore的初始化、V operation、P operation與結束。關於POSIX semaphore的特性說明如下:
Semaphore是Edsger W. Dijkstra於1960年代末期所設計的一種程式設計架構。Semaphore是一個variable (變數)或是abstract data type (抽象資料型別),提供平行運算環境中,控制多個process (程序)或thread(執行緒)存取共享資源的能力,Semaphore可以用於紀錄某一特定資源剩下多少數目可使用;process或thread透過semaphore可以安全的使用共享資源,若特定資源已使用完時,會需要等待資源被釋放。雖然semaphore在防止deadlock或race condition方面是一個很有用的工具,但是程式使用semaphore運作上並無法保證一定不會遇到這些問題。
Semaphore包含兩種:binary semaphore(二進位信號)和counting semaphore(計數信號)。
一、binary semaphore(二進位信號)
binary semaphore值只能是0或1,在邏輯上相當於一個mutex(互斥鎖)。mutex使用上與binary semaphore具有相同功能,但是,mutex主要設計是防止兩個process同時間執行相同的一段code或存取同一資料,而binary semaphore設計上則是限制同時間存取同一資源;很多應用上mutex具有owner(擁有者)的概念,只有鎖住mutex的process,才具有解鎖的權限;相對的,semaphore並無此限制。
二、counting semaphore(計數信號)
counting semaphore值依據semaphore.h的SEM_VALUE_MAX (semvmx)定義。也有作業系統稱作general semaphore。
Semaphore的運作原理
Edsger W. Dijkstra的模型與鐵路操作有關:假設某段鐵路是單線的,因此,一次只允許一列火車通過;semaphore用於協調同步通過該軌道的火車,火車在進入單一軌道之前必須等待信號燈變為允許通行的狀態,火車進入軌道後,必須改變信號燈狀態,防止其他火車進入該軌道;火車離開這段軌道時,必須再次更改信號燈的狀態,以便允許其他火車進入軌道。
或是類似圖書館的研究室使用,假設有10間研究室(SEM_VALUE_MAX=10),若學生要使用研究室便需要向櫃檯申請,櫃檯會記錄有多少間研究室使用中,若10間研究室都被申請使用後,且仍有學生要申請使用,該學生必須等待有其他學生離開,空出研究室後,才能進入使用,該櫃檯就扮演semaphore的角色。
在電腦系統中,信號燈(semaphore)以整數來表示,可用兩種操作行為來說明:
一、V operation:V()會將semaphore的值加1,signal函數或是sem_post()。
二、P operation:P()會將semaphore的值減1,wait函數或是sem_wait()。
P和V的意義來自荷蘭文(Edsger W. Dijkstr為荷蘭人),V代表verhogen,其意思是增加,P代表portmanteau prolaag,其意思是嘗試減小。在P operation中,semaphore在減小之前必須為正,確保semaphore值不為負,並且比該值減小之前小1;在P和V operation中,必須在沒有干擾的情況下進行運算,亦即每個P或V operation必須具備atomic operation特性,該operation是不可分割的(all or nothing behavior)。
從semaphore概念上來說,counting semaphore為一個非負整數計數器,通常用來協調process或thread對共享資源的存取。semaphore value可用來表示可用資源的數目,可在初始化時將semaphore value設為可用資源的數目,然後,在使用資源時減1,在釋放資源時加1;若為負數時,表示資源不足,要存取共享資源的process或thread會被阻擋(block),需要等待semaphore value變為正整數時,才可存取共享資源。實務上,也可將semaphore初始值設為1,使用該資源時加1,釋放資源時減1,若無法再加1時(signal或post回傳-1),表示已無資源可使用,程式需針對此錯誤進行處理;部分作業系統當使用超過最大值時(SEM_VALUE_MAX)會發生overflow(溢位),變為負數,表示資源不足。
由於semaphore並無強制由同一個process或thread來獲取和釋放,因此semaphore可用於非同步事件通知;同時,由於semaphore包含狀態,因此可以非同步方式使用,而不用像條件變數那樣要求獲取mutex。但是,semaphore的效率不如mutex。
Semaphore可以是無名稱的(unnamed)或是有名稱的(named),unnamed semaphore可供單一process或不同process使用,依據初始化時設定決定,named semaphore則在不同process間同步共享資源。
Semaphore的使用
此章節以POSIX semaphore來說明semaphore的初始化、V operation、P operation與結束。關於POSIX semaphore的特性說明如下:
- POSIX semaphore是標準的counting semaphore,使用sem_post()執行V opeation,sem_wait()執行P operation。
- POSIX semaphore的最大值於limits.h中所定義,如下:
#define _POSIX_SEM_VALUE_MAX 32767
define中所定義的最大值32767為POSIX標準規範的值,亦即實際各種作業平台的semaphore最大值至少需為32767才符合POSIX規範;實際最大值可由sysconf()所設定:
long sem_value_max = sysconf(_SC_SEM_VALUE_MAX);
目前實際程式測試,各種主要作業系統的SEM_VALUE_MAX如下:
Windows 2008 : 2,147,483,647
RHEL 5.0 : 2,147,483,647
CentOS : 2,147,483,647
Solaris 10 : 2,147,483,647
HP-UX 11iv3 : 2,147,483,647
IBM AIX 6.1 : 32,767 - 一個semaphore並非被單一thread所擁有,亦即一個thread對semaphore執行sem_wait()時,另一thread可以執行sem_post()。但是作業系統在實作時,同一時間點僅能執行其中一個指令,以維持semaphore的一致性。
- 當建立一semaphore時,須設定semaphore的初始值,且初始值須符合:0 ? initial value ? SEM_VALUE_MAX
- Semaphore動作執行成功會回傳0,失敗會回傳 -1,並可將error number存放在errno,C的function perror(const char* string)可將errno的值存放在一字串,可將字串再列印到stderr。
- sem_trywait(sem_t* sem)不會block呼叫的thread:
- 若semaphore value大於0,會將semaphore減1,立即完成此動作並回傳。
- 若semaphore value小於等於0,會立即回傳錯誤EAGAIN,說明semaphore value非大於0。
一、Semaphore操作函數
後續說明sem_init()、sem_post()、sem_wait()、sem_trywait()與sem_destroy()使用方式。
- sem_init():初始化semaphore
語法:
int sem_init(sem_t *sem, int pshared, unsigned int value);
#include
sem_t sem;
int pshared;
int rc;
int value;
pshared =0;
value =1;
rc = sem_init(&sem, pshared, value);
說明:
(1)第一個參數為semaphore的位址,第二個參數為設定semaphore是否可讓不同process使用,第三個參數為semaphore初始值。
(2)pshared的值為0,不能在process之間共用semaphore,僅能供process的所有thread使用;如果pshared的值不為0,則可以在process之間共用信號。
(3)初始的semaphore值為1。
(4)多個thread決不能初始化同一個semaphore。
(5)不得對其他thread正在使用的semaphore重新初始化。
sem_init()成功完成後會回傳0,若回傳值為-1則表示執行發生錯誤,如果出現下任一情況,該函數將失敗並回傳對應值:
-EINVAL:參數值超過了SEM_VALUE_MAX。
-ENOSPC:始化semaphore所需的資源已經用完,到達semaphore的SEM_NSEMS_MAX限制。
-ENOSYS:系統不支援sem_init()函數。
-EPERM:process缺少初始化semaphore所需的權限。 - sem_post():增加semaphore值(加1)
語法:
int sem_post(sem_t *sem);
#include
sem_t sem;
int rc;
rc = sem_post(&sem);
sem_post()成功完成後會回傳0,若回傳值為 -1則表示執行發生錯誤,如果出現下任一情況,該函數將失敗並回傳對應值:
-EINVAL:未對應到有效的semaphore。
-ENOSYS:系統不支援sem_post()函數。 - sem_wait():減少semaphore值(減1)
語法:
int sem_wait(sem_t *sem);
#include
sem_t sem;
int rc;
rc = sem_wait(&sem);
sem_wait()成功完成後會回傳0,若回傳值為 -1則表示執行發生錯誤,如果出現下任一情況,該函數將失敗並回傳對應值:
-EINVAL:未對應到有效的semaphore。
-ENOSYS:系統不支援sem_wait()函數。 - sem_trywait():嘗試減少semaphore值(減1)
語法:
int sem_trywait(sem_t *sem);
#include
sem_t sem;
int rc;
rc = sem_trywait(&sem);
sem_trywait()成功完成後會回傳0,若回傳值為 -1則表示執行發生錯誤,且不會block呼叫的thread,如果出現下任一情況,該函數將失敗並回傳對應值:
-EINVAL:未對應到有效的semaphore。
-ENOSYS:系統不支援sem_post()函數。
-EINTR:此函數被semaphore中斷。
-EAGAIN:semaphore值小於或等於0,無可用的semaphore。 - sem_destroy():銷毀semaphore
語法:
int sem_destroy(sem_t *sem);
#include
sem_t sem;
int rc;
rc = sem_destroy(&sem);
sem_destroy()成功完成後會回傳0,若回傳值為 -1則表示執行發生錯誤,如果出現下任一情況,該函數將失敗並回傳對應值:
-EINVAL:未對應到有效的semaphore。
-EBUSY:仍有process或thread被阻塞(blocked)在該semaphore。
二、範例程式
下列C範例程式可於不同系統計算SEM_VALUE_MAX的值。
/*semaphore.c*/
/*count SEM_VALUE_MAX*/
/*gcc -lpthread -lrt semaphore.c */
#include
#include
#include
#include
int main (int argc, char *argv[])
{
int value;
int rc = 0;
sem_t test_semaphore;
sem_init(&test_semaphore, 0, 1);
sem_getvalue(&test_semaphore, &value);
printf("The value of semaphore is %d\n", value);
while(rc == 0 & (value < 2147483647 & value > 0) )
{
rc = sem_post(&test_semaphore);
sem_getvalue(&test_semaphore, &value);
}
printf("sem_post returns %d\n", rc);
printf("The value of semaphore is %d\n", value);
rc = sem_post(&test_semaphore);
sem_getvalue(&test_semaphore, &value);
printf("sem_post returns %d\n", rc);
printf("The value of semaphore is %d\n", value);
}
參考文獻
http://compgroups.net/comp.unix.solaris/value-of-POSIX_SEM_VALUE_MAX
http://www.ibm.com/developerworks/cn/linux/l-ipc2lin2.html
http://www.cs.gmu.edu/~rcarver/ModernMultithreading/LectureNotes/Chapter3NotesPthreads.pdf
http://en.wikipedia.org/wiki/Semaphore_(programming)
http://www.5dlinux.com/article/6/2010/linux_38554.html
http://bugs.python.org/file12391/explore_sem_value_max.c
Spinlock 與 Mutex
Spinlock 與 Mutex 都是很常用的同步機制,今天來看看這兩者在 Windows 上有什麼樣的不同!(推薦 MSDN 上的 Locks, Deadlocks, and Synchronization,寫得很不錯!)
Spinlock
我們可以簡單的從中文翻譯「自旋鎖」看出一點端倪,基本上就是個 Busy waiting 的動作,得一直等待指定的鎖被釋放之後,才可以繼續進行下一步動作。概念上非常簡單,實作上就不是如此了。例如:如果鎖還沒被釋放這個執行緒就被 swap-out 而進入 sleep 狀態怎麼辦?兩個執行緒同時要求取鎖的同步該怎麼處理?
Mutex
事實上 Mutex 是一種抽象概念:透過一個變數或物件確保 Critical Section 內的資料同一時間內只會有單一存取。所以文章標題本身就不是個很精確的命題。根據 MSDN 上的說明,Mutex 約可分為以下三類同步機制:
- (Interrupt/Queued) Spinlock
- (Fast/Kernel/Unsafe Fase) Mutex
- Synchronization Event
了解後,我們知道我們真正該比較的是 KeAcquireSpinLock 與 KeWaitForMutexObject 。
那麼,究竟有什麼不同?
簡單的介紹之後,我們可以發現一個重點就是:CPU 使用率。對於 Spinlock 來說,是佔用 CPU 時間來做等待動作的,也因此,我們可以歸納出兩者的不同的使用時機:
- 同質多核心的環境下,Critical Section 所花費的時間如果不多,適合 Spinlock,因為我們可以減少 Context Switch 的時間。(單核心其實兩者的比較沒有太多意義,因為某些系統會透過中段的開關實作 Spinlock)
- 在 Windows 中,使用 Spinlock 會把該執行緒提升到 DISPATCH_LEVEL,這在某些情況下可能是不允許的,因此這時候就不得不使用 Mutex 了(APC_LEVEL)。
- Mutex 比較適合保護一塊區域(所需時間長),而 Spinlock 比較適合保護一個變數(所需時間短)。
Semaphore?
說到同步怎麼可以不提 Semaphore?最容易搞混的就是 Mutex 與 Semaphore 了,因為 Mutex 有時候也被拿來當做同步機制的概稱。其實 Mutex = Binary Semaphore,如果我們只說 Semaphore 通常都是指 Counted Semaphore = Reentrant Mutex。 除此之外,在某些系統中(e.g., Windows),還有些細部差別 。
- Semaphore 可以設定同時被 Acquire 的次數,而 Mutex 則無法。所以若 Critical Section 允許被兩個以上的執行緒執行的話,通常我們會採用 Semaphore(但相對帶來的副作用用就是 Deadlock)。
- Mutex 只能被當初 Acquire 的執行緒 Release,Semaphore 則無此限制。
想要更深入瞭解的話,可以參考這篇文章。
spinlock & mutex & semaphore
REF:
http://www.hitripod.com/blog/2012/03/synchronization-mechanism-comparison-spinlock-mutex/
spinlock,mutex,semaphore,critical section的作用和區別
Mutex是一把鑰匙,一個人拿了就可進入一個房間,出來的時候把鑰匙交給隊列的第一個。一般的用法是用於串行化對critical section代碼的訪問,保證這段代碼不會被並行的運行。
(A mutex is really a semaphore with value 1.)
Semaphore是一件可以容納N人的房間,如果人不滿就可以進去,如果人滿了,就要等待有人出來。對於N=1的情況,稱為binary semaphore。一般的用法是,用於限制對於某一資源的同時訪問。
Binary semaphore與Mutex的差異:
在有的系統中Binary semaphore與Mutex是沒有差異的。在有的系統上,主要的差異是mutex一定要由獲得鎖的進程來釋放。而semaphore可以由其它進程釋放(這時的semaphore實際就是個原子的變量,大家可以加或減),因此semaphore可以用於進程間同步。 Semaphore的同步功能是所有系統都支持的,而Mutex能否由其他進程釋放則未定,因此建議mutex只用於保護critical section。而semaphore則用於保護某變量,或者同步。
另一個概念是spin lock,這是一個內核態概念。 spin lock與semaphore的主要區別是spin lock是busy waiting,而semaphore是sleep。對於可以sleep的進程來說,busy waiting當然沒有意義。對於單CPU的系統,busy waiting當然更沒意義(沒有CPU可以釋放鎖)。因此,只有多CPU的內核態非進程空間,才會用到spin lock。 Linux kernel的spin lock在非SMP的情況下,只是關irq,沒有別的操作,用於確保該段程序的運行不會被打斷。其實也就是類似mutex的作用,串行化對critical section的訪問。但是mutex不能保護中斷的打斷,也不能在中斷處理程序中被調用。而spin lock也一般沒有必要用於可以sleep的進程空間。
http://www.hitripod.com/blog/2012/03/synchronization-mechanism-comparison-spinlock-mutex/
spinlock,mutex,semaphore,critical section的作用和區別
Mutex是一把鑰匙,一個人拿了就可進入一個房間,出來的時候把鑰匙交給隊列的第一個。一般的用法是用於串行化對critical section代碼的訪問,保證這段代碼不會被並行的運行。
(A mutex is really a semaphore with value 1.)
Semaphore是一件可以容納N人的房間,如果人不滿就可以進去,如果人滿了,就要等待有人出來。對於N=1的情況,稱為binary semaphore。一般的用法是,用於限制對於某一資源的同時訪問。
Binary semaphore與Mutex的差異:
在有的系統中Binary semaphore與Mutex是沒有差異的。在有的系統上,主要的差異是mutex一定要由獲得鎖的進程來釋放。而semaphore可以由其它進程釋放(這時的semaphore實際就是個原子的變量,大家可以加或減),因此semaphore可以用於進程間同步。 Semaphore的同步功能是所有系統都支持的,而Mutex能否由其他進程釋放則未定,因此建議mutex只用於保護critical section。而semaphore則用於保護某變量,或者同步。
另一個概念是spin lock,這是一個內核態概念。 spin lock與semaphore的主要區別是spin lock是busy waiting,而semaphore是sleep。對於可以sleep的進程來說,busy waiting當然沒有意義。對於單CPU的系統,busy waiting當然更沒意義(沒有CPU可以釋放鎖)。因此,只有多CPU的內核態非進程空間,才會用到spin lock。 Linux kernel的spin lock在非SMP的情況下,只是關irq,沒有別的操作,用於確保該段程序的運行不會被打斷。其實也就是類似mutex的作用,串行化對critical section的訪問。但是mutex不能保護中斷的打斷,也不能在中斷處理程序中被調用。而spin lock也一般沒有必要用於可以sleep的進程空間。
執行緒
直達java虛擬機器
執行緒---互斥 為因 同步為果
synchronized 同步區塊對同一條執行緒來說是可重入的, 不會出現自己卡死自己的情況
同步區塊在已進入的執行緒 完成之前, 會阻塞其他執行緒的進入
java執行緒是 映射到 作業系統 原生執行緒上的
阻塞或喚醒執行緒需要 ( 作業系統 從使用者狀態 換到核心狀態 的 ) 狀態轉換,
耗費許多處理器時間,可能比 使用者程式執行時間 還要久
synchronized 是重量級操作 (Heavy weight)
在通知系統主塞執行緒 , 進入核心狀態之前, 會先加入自旋鎖, 避免頻繁切入核心狀態
java.util.concurren (J.U.C) ReentrentLock重入鎖 實現 同步
公平鎖: 鎖解開後 有序的使用:反之 不公平, 競爭 鎖,
等待可中斷: 鎖被占用很久, 不等轉作其他任務
鎖對應多個條件: ReentrentLock 可直接多設幾個條件就好
synchronized 要多設幾個鎖
1.6之後 synchronized ReentrentLock 持平
- 阻塞同步 (bloking synchronize) 悲觀, 資源競爭就要鎖
執行緒---互斥 為因 同步為果
synchronized 同步區塊對同一條執行緒來說是可重入的, 不會出現自己卡死自己的情況
同步區塊在已進入的執行緒 完成之前, 會阻塞其他執行緒的進入
java執行緒是 映射到 作業系統 原生執行緒上的
阻塞或喚醒執行緒需要 ( 作業系統 從使用者狀態 換到核心狀態 的 ) 狀態轉換,
耗費許多處理器時間,可能比 使用者程式執行時間 還要久
synchronized 是重量級操作 (Heavy weight)
在通知系統主塞執行緒 , 進入核心狀態之前, 會先加入自旋鎖, 避免頻繁切入核心狀態
java.util.concurren (J.U.C) ReentrentLock重入鎖 實現 同步
公平鎖: 鎖解開後 有序的使用:反之 不公平, 競爭 鎖,
等待可中斷: 鎖被占用很久, 不等轉作其他任務
鎖對應多個條件: ReentrentLock 可直接多設幾個條件就好
synchronized 要多設幾個鎖
1.6之後 synchronized ReentrentLock 持平
- 非阻塞同步 (non-bloking synchronize), 衝突偵測, 重試 共用資料 直到不衝突
訂閱:
文章 (Atom)