
http://www.stackasterisk.jp/tech/java/sjcp05_15. …
↑の問題の解答で
”あるスレッドが「9行目~11行目、15行目~19行目」までの処理を実行している間に、
「23行目~25行目」の処理を他のスレッドが実行することはありえるのです。”
とあるのですが
removeObj1メソッドとremoveObj2メソッドは
synchronizedメソッドだと思うので
removeObj1メソッドとremoveObj2メソッドが
同時に実行される事はないと思ったのですが
synchronizedメソッドないにsynchronizedブロックが
あるとブロック単位でのロックになるのでしょうか?
addObj1が実行されているときに
removeObj2が実行されるのはわかるのですが、
”ArrayListのremove( )メソッドを呼ぶときに
IndexOutOgBoundsExceptionが発生する可能性があるので
答えはC, Dになります。
と言うのがどうもわかりません。”
宜しくお願いします。
No.5ベストアンサー
- 回答日時:
質問者さんは、理解できていると思います。
確かにあの図はおかしいと思います。
図の中で「synchronized(lockObj1)があるから待たされる」と言っていますが、
lockObj1はstaticではないため、「synchronized(lockObj1)があるから待たされる」ためには、
どのスレッドも同じMonitor オブジェクトを参照しなければなりません。
ということは、メソッドのsynchornizedで引っかかります。
つまり、きちんと処理されることになります。
ただ、図とは違ってきますがスレッドがそれぞれ別のMonitor オブジェクトを
参照していたとすると、待ちは一切発生しないので解答のとおり例外が発生する
可能性があります。
*lockObj1、lockObj2がstaticだったら、図の通りになったかな。
この回答への補足
ご返答ありがとうございます。
そうですか、、やっぱりあの図がおかしいですか。。
おかげ様で もやもやが取れました。(^^
すいません、今一度確認させて下さい。
> *lockObj1、lockObj2がstaticだったら、図の通りになったかな。
どのスレッドも同じMonitorオブジェクトを参照している場合
lockObj1、lockObj2がstaticだったとしても
synchornizedメソッドで排他がかかるので
図のようにremoveObj1メソッドとremoveObj2メソッドが
同時に実行される事はないと考えて宜しいでしょうか?
No.6
- 回答日時:
そして、No5を補足すると
###No5##の内容の一部
>ただ、図とは違ってきますがスレッドがそれぞれ別のMonitor オブジェクトを
>参照していたとすると、待ちは一切発生しないので解答のとおり例外が発生する
>可能性があります。
とありますが。
具体的にどんな時に
例外が発生する可能性があるかという説明については、
私のNo2の回答の
↓の部分以降を読んでもらえればわかります。
##No2の回答の一部
if( i < list.size() ) {
という
チェック処理がありますが。
####
No.4
- 回答日時:
>removeObj1メソッドとremoveObj2メソッドは
>synchronizedメソッドだと思うので
>removeObj1メソッドとremoveObj2メソッドが
>同時に実行される事はないと思ったのですが
「メソッドをsynchronizedにしたのに同期化されないのはなぜ?」
という過去の質問の、
「質問文自体」と「No.5の回答」を参照。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=749910
(http://www.gimlay.org/~javafaq/S021.html
「メソッドに付ける synchronized って何ですか?」)
この回答への補足
ご返答ありがとうございます。
皆様にご教授頂いて
排他の範囲はメソッドではなくインスタンスなので
インスタンスが異なれば待たされずに同時に実行できる。
、、という事で理解できそうな気がしたのですが
自分の中でどうしても【解説】の上の方の絵とマッチしません。
th1とth2でクラスMonitorを別インスタンスとしてスレッドを実行した場合、
インスタンスが異なるのでth1で実行中のメソッドもth2で実行できると
思っているのですが、それはあっていますでしょうか?
解説の絵だとthisもlockObj1,lockObj2も同じものを
指している(?)ので同一インスタンスですよね?
それでいてsynchronizedメソッド(this)で排他が
かかっている中のsynchronizedブロックが同時に実行できるというというのが
どーもよく解りません。(^^;
synchronizedメソッドでなければ自分の中では解説の絵ともマッチするのですが。。
なにか見かたがおかしいのでしょうか?
なかなか難しいですが、なんとかスレッドを理解したいと考えております。
今一度、アドバイス頂ければと存じます。
宜しくお願い致します。
No.3
- 回答日時:
<<<<訂正>>>>>
誤)
しかし、
lockObj1
をロックしている
removeObj2
は上記の2つとは、
独立的、並列的に実行させることは
可能です。
正)
しかし、
lockObj2
をロックしている
removeObj2
は上記の2つとは、
独立的、並列的に実行させることは
可能です。
#######################3
lockObj1 → lockObj2
この回答への補足
ご返答ありがとうございます。
もうちょっとで解りそうな気がするのですが
No4.の方の補足に新たに質問を書き込ませて頂きました。
もしよろしければアドバイス頂ければと思います。
宜しくお願い致します。
No.2
- 回答日時:
一般的にロックはリソースに対して取得するものです。
DBの行、ページ、や
ファイルシステム上のファイル、
メモリ上のあるオブジェクトなど。
javaで
synchronized(
ブロックのなかで、
()のなかにロックしたいオブジェクトを
与えてます。
ちなみに、
synchronized void foo() {
}
のような場合は
void foo() {
synchronized(this) {
}
}
にほぼ、同じです。
lockObj1 と
lockObj2 は
ロックの制御だけのために
使われているようです。
addObj1
と
removeObj1
はともに
synchronized(lockObj1){
の中で
listにアクセスしているので、
addObj1
と
removeObj1
が同時に
listにアクセスすることはありません。
しかし、
lockObj1
をロックしている
removeObj2
は上記の2つとは、
独立的、並列的に実行させることは
可能です。
if( i < list.size() ) {
という
チェック処理がありますが。
removeObj1とremoveObj2
の両方がこのチェック処理を
通過して、ifの中にはいった時、
removeObj1が、remove(i)
を実行した結果たまたま、
list.size() - 1 が
i より、小さくなった時
removeObj2が
remove(i)
を実行すると、
IndexOutOgBoundsException
が発生します。
removeObj1とremoveObj2のremove(i)
を実行する順番が逆であれば、
removeObj1が
remove(i)
を実行したところで、
IndexOutOgBoundsException
が発生します。
理解のポイントとしては、
同じリソースをロックしている
もの同士(スレッド)だけが、
互いに排他制御をするという
ことです。
syncronizedで、そのスレッドが
どのリソースのロックを取得しようと
しているかに注目してください。
以上
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- Visual Basic(VBA) vbaエクセルマクロについて RemoveDuplicatesを使わずに、重複行を削除すらマクロを作 3 2023/03/02 22:03
- Visual Basic(VBA) エクセルVBAで以下のようなコードを書いたらエラーになりました。何処が間違っているの教えて? 1 2023/02/10 18:30
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
配列のメソッド
-
Labelコントロールに数字を代入...
-
mainメソッドのthrows節で設定...
-
final修飾子を使っているのに、...
-
FEM解析の読み方は?
-
CALLされていないメソッドを見...
-
C# 演算 最大値 最小値 表現の仕方
-
Refreshメソッドの使い方
-
c#でVBのcall的役割を果たすコ...
-
JSPで<SELECT>の中にDBから持っ...
-
Strutsで「setterメソッドが見...
-
コマンドプロンプト実行後に画...
-
エクセルのマクロでプリンタを...
-
処理内容がほぼ同じメソッドの...
-
DBを扱う上でのclose()メソッド...
-
エクセルVBAにおけるON TIMEメ...
-
javaの中でaddElementは何ですか?
-
VB.NET2017 の IntelliSense に...
-
ByteArrayInputStreamを配列に
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAで、条件に一致する...
-
【sendkeysメソッドが動かずに...
-
mainメソッドのthrows節で設定...
-
VBA コピーが出来ません…!
-
DataGridViewでセルクリックイ...
-
コマンドプロンプト実行後に画...
-
0歳児の指しゃぶりに関して
-
エクセルVBAにおけるON TIMEメ...
-
javascriptからjavaを呼び出したい
-
配列のメソッド
-
CALLされていないメソッドを見...
-
final修飾子を使っているのに、...
-
Labelコントロールに数字を代入...
-
VBPをダブルクリックするとたま...
-
ウィンドウを最前面にできません
-
処理内容がほぼ同じメソッドの...
-
Application.Wait の参照設定
-
C#.net Define文
-
C# 演算 最大値 最小値 表現の仕方
-
Excel VBA でExcelを終了したい...
おすすめ情報