寫過了 C# 的 async 與 await, 回頭來看 synchronized
就真是豁然開朗了。
簡單的說,當很多 Thread 同時執行--
例如 Class A 裡有長時間執行的 Thread,
Class B 裡也有長時間執行的 Thread,
而 A B 的可能會用到同一個物件,必須要輪流使用,
所以最好讓他們互相等待。
如果這個東西 A 正在用,B 就先在旁邊耐心等待一下,
等 A 用完了 B 再開始他的工作。
synchronized 有三種宣告方式:
Synchronized Class Method: class class_name { static synchronized type method_name() { statement block } } 所有的在這個 method 裡的 statements 將變成 synchronized(同步化), 而 Lock 就是這個類別的物件(單一)。
Synchronized Instance Method: class class_name { synchronized type method_name() { statement block } } 所有的在這個 method 裡的 statements 將變成 synchronized(同步化), 而 Lock 就是這個類別的實體物件。
Synchronized Statement: class class_name { type method_name() { synchronized (object) { statement block 在這裡的 statements 都將同步化,而 Lock 是傳入的物件(Object)。 } } } |
我把所謂的 Lock 想成是一個"執行的權力",Thread 想像成工人,而物件想像成要做的事情。
工人要有執行權力才可以做要做的事。
在沒有 synchronized (同步化)之前,各自做各自的事情,不一定誰先做完,
在我們不介意的情況下,就各自執行各自的工作。
但是如果這些工人有共同需要使用的工具,或共同修繕的房屋,
如果工人A 先開始做事情,工人B 來了發現工具被佔用,很快他就走了,
結果根本沒有做事情。或者工人C 不確定 A 多久做完,等了一個月才來,
A 只花十天就完成,白白浪費了二十天等待。
所以工人們需要一個默契,按照順序工作,才可以確保
每個人都有做到應該做的工作,
這時候我們才會讓這些工人同步化,同步化的規則是:
1.確保每個工人都有做到該做的工作
2.輪流執行,不要同時做工作
所以 Java 定義了一道鎖,讓這道鎖成為"執行的權力",
擁有執行權力的人,才可以執行,其他人必須先暫停。
這樣的好處,就是可以確保工人們不會因為沒有工具而離去,
該做的事情卻沒做。
簡言之,就是讓這些工人們照排隊來做工作,
就可以確定每個工人輪流使用工具,做好該做的事情。
所以只要在同一個 Lock 裡頭的工人,就會同步化,
會按照同步化的規矩來執行,因此只要利用 synchronized 來建立
在同一個 Lock 下,就可以達到這樣的成效了。
留言列表