>>429
まぁ 1 台構成ならファイルでも出来るわな。File#createNewFile() はアトミック性が
保証されてるし。

1) ログイン時に適当なディレクトリに <userid>.lock ファイルを作る。ファイル
  作成に成功すればログイン完了、失敗すれば二重ログイン扱い。

2) ロックファイルの作成に成功した場合、File#deleteOnExit() を仕掛けておく。

さらに一定時間経過したロックファイルを削除しなければならないので以下を処理が
必要。

1) ログインが完了したユーザのセッションに HttpSessionBindingListener を
  実装したオブジェクトをぶち込んでおく。このオブジェクトは valueUnbound()
  時に自分のロックファイルを削除する。

2) 適当なスレッドを立ててロックファイルの最終更新日から一定時間経過したもの
  を消すようなサーブレットを作成 (この場合、リクエストのたびに
  File#setLastModified() が必要)。このサーブレットをサーブレットコンテナの
  スタートアップに登録。init() でロックファイルをすべて消す処理を入れておくと
  良い。

ただ、ブラウザの×ボタンを押した時にはしばらくの間ログインできなくなるがな。
2重ログインを防止しようとすると避けられない問題。さもなくば同一 IP からの
2重ログインを許可するしかない。