- - PR -
ディレクトリの排他制御
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-03-09 17:18
coasmさま
ご教授いただきましたように、synchronizedにて制御してみましたが、 こちらのRedHatLinux ES4では、排他制御かからないようです。 以下、コードです。
↑を書きまして、 test.jsp
とします。 そして、ブラウザを二つ立ち上げて、test.jspに同時にアクセスすると Windowsでは、ロックです。というエラーレポートが出力され正常に 排他制御かかっているのですが、Linuxだと、 ロックしました と2回標準出力に表示されます。 自分のsynchronizedブロックの使い方が悪いのが原因かもしれません。 引き続きまして、ご教授いただけると幸いです。 | ||||||||
|
投稿日時: 2007-03-09 17:34
Tdnr_Symさん、かつのりさん、ご返信いただきましてありがとうございます。
> java.util.concurrent.Semaphore > これって使えないんですかね? なるほど。 少し、Google先生に聞いてみたのですが、参考になるページが見つかりました。 もう少し調べてみて、検証をしてみたいと思います。 > VMより上位の層のロック取得ができないと、 > クラスタ時で困りますね。 自分は、クラスタ時のことは見目想定しておりませんでした・・・。 今回、排他制御を自分で実装してみて初めて、その難しさを感じました。 データ操作は、ほとんどデータベース任せなのですが、そういうことばかり していると、こういうときに自分で実装できませんね・・・。 データベースのありがたみと、自分の無知を改めて感じました。 精進したいものです。 | ||||||||
|
投稿日時: 2007-03-10 00:40
は、同一オブジェクトのみ同期します。けっして同一クラスではありません。 Windowsは、運よく動いたのかな。 | ||||||||
|
投稿日時: 2007-03-10 12:04
比較的高速な処理のためにI/Oを使用するロックはコストが高すぎますが、
I/O処理の為のロックであれば、DBを使うのもありでしょう。 ------------------------------------------------------------------------ 1.ロックテーブルを用意 例えば、locktable(key int, locked bit) 2.指定のキーかつlockedがfalseという条件で、 select/for updateで行ロックを取得して、lockedをtrueに更新、コミット 3.2の処理に失敗したらロック失敗、成功したらロック成功とする 4.本処理が終わればlockedをfalseに更新 ロックしたまま例外で何も出来なくなったとき用に、 日付カラムを持って、一定の期間という条件を追加するというのもあり。 ------------------------------------------------------------------------ という感じでDBのロックを使うのもありかなと思います。 | ||||||||
|
投稿日時: 2007-03-10 17:04
synchronizedキーワードはまずは単体で意味を理解するのが重要だと思っています。
メソッドにsynchronizedキーワードをつけるのはいわゆるシンタックスシュガーですね。
というのが基本です。 ロックオブジェクトはObjectのインスタンスであれば何でもかまいません。 Objectはロックをもっていて、それをスイッチにして排他しているイメージ。 非staticなメソッドにsynchronizedキーワードをつけた場合は 該当インスタンスをロックオブジェクトとしてsynchronized句を書くのと同等。 staticなメソッドにsynchronizedキーワードをつけた場合は 該当クラスのClassインスタンスをロックオブジェクトとして synchronized句を書くのと同等になります。
|