首頁
中文書目錄
原文書目錄
 站內快速搜尋
資源中心
Book Series
Special Interest













■好消息,歐萊禮書籍已重新鋪貨至各大書局及網路書店,歡迎讀者選購       ■歡迎各院校採用歐萊禮書籍,學校團購請洽校園服務團隊

[FAQ]

Java錦囊妙計中 範例 16-6 的問題

*!* 提到:

  1. 範例16-6 EchoServerThread.java 中使用synchronized是否真有其必要 如果 不用synchronized會有什麼影響p523的解釋不夠清楚(本程式似乎跟公用變數無任何關係)
  2. p523在同步區中呼叫accept(), 每次就只有一個thread能呼叫accept():那不就是第一個連進來的client沒斷線之前 第二個client是無法連線成功的?


您好,

我想,p.523 的解釋確實不夠清楚,所以我幫原作者再解釋一次。

首先,範例 16-6 展示最直接了當的作法,但是這個作法有個缺點,那就是每次連線都會產生新 thread 的問題。作者提出的解決之道是 thread pool。

但是,使用 thread pool 時,表示伺服端同時會有多個 thread 有權存取同一個 ServerSocket,但這不是我們要的情況,所以必須將 accept() 放在同步區,限制每次只能有一個 thread 使用 ServerSocket。( 代表 ServerSocket 的那個 sock 變數,就是所謂的公共變數 )。

也就是說,同步區的設置,基本上是為了解決 thread pool 的問題,而不是要設置在 16-6 這個沒有 thread pool 的範例程式。

範例 16-7 示範了如何加上 thread pool,以及如何將 ServerSocket.accept() 放在同步區。

回答你第二個問題,accept() 在收到 client 連線要求之後就返回了,其它 thread 能不能呼叫 accept(),無關 accept() 前一次傳回的連線是否結束。下列同步區 :

synchronized(servSock) {
 clientSocket = servSock.accept() ;
}

只是限定每次只能有一個 thread 有機會呼叫 accept(),當 thread 離開同步區,另一個在同步區之前被擋下來的 thread才可以進入同步區。而離開同步區的 thread 在完成它的工作之後,又回到同步區之前等待。換句話說,在 p.525 程式中,同步區之前的那個註解 ( // 在此等待下次連線 ),可被視為一個無形的 thread queue。

這樣說你明白了嗎 ?

林長毅 Technical Editor


| 首頁 | 聯絡我們 |
© 2009, O'Reilly Media, Inc. Taiwan Branch