回答編集履歴
1
アドバイザリロックの解説を追加
test
CHANGED
@@ -19,3 +19,13 @@
|
|
19
19
|
ただし、例に挙げられているものについては、```_classnameToInstance```という別のシングルトンを持っているので、これを synchronized の対象にしても実装できてると思いますので、シングルトンの排他制御の例としてはいまいちだと思います。
|
20
20
|
|
21
21
|
たとえば、何か重い初期化ををオンデマンドに実行するとか、Java 以外のリソースへのアクセスを排他制御したい場合などはシングルトンのロック専用オブジェクトを作ることになると思います。
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
**ロックの概念**
|
26
|
+
|
27
|
+
ロックにはアドバイザリロックと強制ロックがあります。Java の synchronized はアドバイザリロックです。つまり、排他制御に参加するスレッドが互いに synchronized をする約束のもとに成り立っています。誰かが約束を破って synchronized をかけずにアクセスすると、オブジェクトのメンバを更新できたりして、排他制御が崩れてバグになります。
|
28
|
+
|
29
|
+
一方で、ファイルのロックなどにおいては、強制ロックが実装されている場合があります。これは、OSレベルでロックが掛かり、一つのプロセスがロックをかけると、他のプロセスからは排他制御に参加する気がなくてもアクセスできなくなります。
|
30
|
+
|
31
|
+
一般的に、強制ロックはアドバイザリロックに比べて、コストが高いです。
|