2007年1月25日 星期四

Java synchronized概念

假設有一排餐廳,他們的編號從1...到無限大 ,每間餐廳都通過Restaurant標準,因此都能提供某些固定的服務。
每間餐廳都擁有一些一般區域與一個預約包廂,一般區域可以讓任意數量的人通行;而包廂只能同時讓一個人使用,若是有多於一個人要用,第一個進入包廂的人會將門鎖上,因此其他要進去的人就無法進入了,另外。
這些餐廳共用一間豪華廁所,也是一次只能容納一個顧客,若廁所中已經有人,則後到者要等待。

在此例子,每個物件與 Java術語的對應關係是:

  • 餐廳標準Restaurant:Class Restaurant
  • 餐廳1號:Instance 1 of Restaurant
  • 每間餐廳的一般區域:Normal Methods of Instance Restaurant
  • 每間餐廳的包廂:Synchronized Methods of Instance Restaurant
  • 顧客:Thread
  • 所有餐廳共用的豪華廁所:Synchronized Static Methods of Class Restaurant
另外,所謂的包廂,指的是一組房間,因此所有被設定為synchronized的method都算在同一組包廂內。

1.現在若有兩人想要使用同一個餐廳的包廂,後到者B會被檔在門外,而先到者A可以進入包廂並任意使用其中的任何房間,B必須呆呆等到A離開這個包廂,或者A自願進入一間等待室,讓B進入。

在此例中,Thread A呼叫了餐廳instance r1的synchronized method m1();且Thread B隨後呼叫r1的另一個synchronized method m2();則B被阻擋,直到A離開m1()或者A執行了r1的wait()為止。

2.另一例子,若A進入包廂,但B在一般區域活動是沒有問題的,B並不會受到阻擋

1 則留言:

雪羽楓 提到...

具體,生動,實用! 我最喜歡這種的舉例了: )