質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

9594閲覧

Javaのファイルオブジェクトの排他処理について

ryo_se

総合スコア68

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/01/31 06:53

編集2016/02/01 11:07

JavaのFileオブジェクトについて質問があります。
例えばクライアント側のアクションによって、一つのテキストファイルのデータを確認するという処理があったとします。
(データを確認した後はcloseします)

その動きを30人でほぼ同時に行った場合、1つのコネクションがファイルを掴んでクローズするまでは、他は待ち状態になるのでしょうか?

追記

仕様としてはweb系のアプリケーションになります。
struts2をフレームワークとしたjavaアプリケーションをtomcatに配備して、該当ページに複数のクライアントがアクセスする形です。

コネクションとは書きましたが、本稿においてはDBを考慮する必要は無くて大丈夫です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/02/01 02:02

『クライアント「側」』『コネクション』という単語から、1端末内で複数のJavaプロセスを同時に起動した場合の話では無いようにも見えます。仮にアプリケーションサーバ上での話だとすると現在の質問文のままでは期待する回答は集まらないと思いますので、環境をもう少し具体的に書いてみてください。
guest

回答1

0

ベストアンサー

何も排他制御をしていなければ開発者や利用者の指示通りのタイミングで動くでしょうから、意識して同時に動かそうとすれば、同時に動く可能性も高いと思います。

同時だったとしても、ファイルに対してロックをかけず読み込みを行うだけであれば、普通のファイルシステムならば同時アクセスでも問題なく処理できるはずです。しかし、ファイルに対して書込やロックをかけるのであれば処理中に2つ目のアクセスが発生した時点で Java は例外を吐くでしょう。

Java で明示的に待ち状態なりの排他制御を行いたければ synchronized を使ってメソッドなり該当処理をブロック化しておけば言語レベルで同時実行から保護できます。

今回の場合であればファイルを開いてから閉じる処理なり、その処理を含むメソッドなりを synchronized で対処しておけば(実行している Java 環境に限れば)同時実行された場合でも必ず1つずつ動くことが保証されます。質問にコードは含まれていないため、検索すれば山程サンプルも出てきますし、書き方は割愛します。

少々脱線しますが、synchronized は実行環境となる JVM (Java 環境) だけの話ですので、それ以外の世界には影響力はありません。全体設計の領域の話にはなりますが、Java と無関係なプログラムやシステムから該当ファイルに対して書込やロックが行われる場合、適切なタイミングやフロー制御といった互いの考慮が無ければ、片方の処理系でロックしたために(考えなしに書込を行っていた)周辺のシステムが適切に動かなくなる。という状況も起こり得ます。

条件次第にはなるでしょうが、アクセスしてくる規模が大きいあるいは頻度が高く、ファイルサイズが手頃で、頻繁に内容は変わらず、読込だけ。という条件の場合、読める時にキャッシュとして文字列なりハッシュマップなり処理しやすいオブジェクトとして確保しておき、あとは最終更新日時を随時確認しながら適時リフレッシュを行う形にすれば、コネクションと絡んでいたファイルアクセス自体の問題を分離できます。環境設定ファイルやらが典型ですが、システムによっては実行開始直後に1回読めば事足りるパターンもあるのではないでしょうか?

以上、ご参考になれば幸いです。

投稿2016/01/31 08:55

ps13zier

総合スコア433

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問