2010-02-08 70 views
3

我有一個註冊頁面,收到令牌廣告解析它們,並在參數適用時登錄用戶。java:競爭條件 - 有沒有辦法確保幾行代碼一起執行?

即我檢查令牌,向我從分貝除去令牌時的時間之間,另一用戶可以使用相同的標記登錄。有沒有辦法確保特定範圍的代碼行將被執行而沒有干擾,所以我不會出現競態條件問題?

感謝

更新

我有兩臺服務器。

  1. 的Apache Tomcat 6
  2. RED5 V0.9(免費java基於Flash流媒體和通信服務器)

我正在寫的Facebook遊戲應用。

遊戲本身是用土坯Flash Builder中2

遊戲本身將使用RED5服務器提供服務。問題是red5沒有收到請求和響應頭信息,並且因爲無法檢索會話信息以便從Facebook獲取信息。

爲了解決用戶連接到tomcat服務器的問題,該頁面檢查會話中的facebook相關信息,並使用tinyFBClient連接到facebook,並將信息存儲在mysql數據庫(用戶詳細信息)中,以便確保這個用戶是要連接到red5的用戶。

一旦令牌被創建。 tomcat頁面顯示一個對象HTML元素以顯示相關的SWF文件(遊戲文件)。 tomcat頁面將令牌傳遞給該SWF文件。一旦SWF文件被加載,它就會使用該令牌並使用它連接到red5並找出用戶信息。

我希望這樣的描述可以幫助您瞭解我的需要。 感謝您的支持!

回答

3

你可以同步的代碼塊,使得只有一次一個線程可以執行它。但是,這看起來不是一個很好的解決方案,因爲它會減慢你的應用程序。您想讓多個用戶同時登錄。

令牌如何創建?如果您要在服務器端爲響應用戶登錄而生成它們,則一個用戶不應該能夠使用其他用戶的令牌。

+0

我更新了主帖,提供更多信息,謝謝! – ufk 2010-02-08 15:51:17

2

我不確定爲什麼要爲登錄創建令牌。你的問題似乎暗示着這個令牌在數據庫上,而不在內存中。如果是這樣,同步和互斥鎖不會真的幫助,你需要的是用「select for update」來鎖定數據庫記錄。

也許這會導致很多不相關的複雜性,但爲什麼你要創建一個令牌來做登錄?每當我做登錄時,我只需從屏幕或傳入表單收集用戶標識和密碼,檢查數據庫以查看組合是否有效,如果是,請讓用戶進入。您需要使用令牌的方式是什麼?

+0

我更新了主帖,解釋了爲什麼我需要使用令牌。謝謝 – ufk 2010-02-08 15:52:04

1

你說你「從數據庫中刪除令牌」。數據庫是一個SQL數據庫嗎?如果是這樣,那麼你可以使用交易來避免競爭條件。它看起來像這樣:

  1. 創建一個唯一的會話ID,例如, UUID sessionID = UUID.randomUUID();
  2. 開始交易
  3. 從數據庫中刪除任何與請求中的令牌相匹配的令牌,例如
    DELETE FROM令牌WHERE TokenID = <請求令牌>
  4. 獲得受影響的行數
  5. 如果受影響的行數正好是1,則該標記是有效的。創建一個會話,例如
    INSERT INTO會話值(sessionUUID,用戶ID,loginTime,...)
  6. 提交交易

現在如果登錄成功(即受影響的行數正好是1),向客戶端發送一個cookie包含會話ID。

+1

我使用Myisam分貝,據我所知它不支持交易。 – ufk 2010-02-08 16:02:19