寫過了 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 下,就可以達到這樣的成效了。

 

arrow
arrow
    全站熱搜

    keep walking 發表在 痞客邦 留言(0) 人氣()