2010-02-08 67 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