回答編集履歴
6
修正
answer
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
|
15
15
|
今回の件の要点は、スレッドセーフの話です。
|
16
16
|
|
17
|
-
スレッドセーフな作りになってないので、複数のスレッドでAssetが同時に呼ばれると最初の_instanceのnewが終わるまでの間に
|
17
|
+
スレッドセーフな作りになってないので、複数のスレッドでAssetが同時に呼ばれると最初の_instanceのnewが終わるまでの間に他のスレッドがif文をすり抜けてしまう事が起こり得ます。
|
18
18
|
(newが完了するまで_instanceはnullのままなので)
|
19
19
|
|
20
20
|
解決方法はいろいろあります。
|
5
修正
answer
CHANGED
@@ -14,7 +14,8 @@
|
|
14
14
|
|
15
15
|
今回の件の要点は、スレッドセーフの話です。
|
16
16
|
|
17
|
-
スレッドセーフな作りになってないので、複数のスレッドでAssetが同時に呼ばれると_instanceが
|
17
|
+
スレッドセーフな作りになってないので、複数のスレッドでAssetが同時に呼ばれると最初の_instanceのnewが終わるまでの間に各スレッドがif文をすり抜けてしまう事が起こり得ます。
|
18
|
+
(newが完了するまで_instanceはnullのままなので)
|
18
19
|
|
19
20
|
解決方法はいろいろあります。
|
20
21
|
例としてロックオブジェクトを使うやり方を紹介します。
|
4
修正
answer
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
|
15
15
|
今回の件の要点は、スレッドセーフの話です。
|
16
16
|
|
17
|
-
スレッドセーフな作りになってないので、複数のスレッドで_instanceがNULLの間に各スレッドがif文をすり抜けているのだと思われます。
|
17
|
+
スレッドセーフな作りになってないので、複数のスレッドでAssetが同時に呼ばれると_instanceがNULLの間に各スレッドがif文をすり抜けているのだと思われます。
|
18
18
|
|
19
19
|
解決方法はいろいろあります。
|
20
20
|
例としてロックオブジェクトを使うやり方を紹介します。
|
3
静的コンストラクタ補足追加
answer
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
静的コンストラクタを勘違いされているようです。
|
3
3
|
静的コンストラクタとは以下のような書き方をするもので、
|
4
4
|
プログラム全体で数えて初めてそのクラスが作られた時に一度だけ実行されます。
|
5
|
+
追記:staticメンバが初めて参照される場合でも呼ばれるようです。その場合でもプログラム全体で実行されるのは一度だけです。
|
5
6
|
```C#
|
6
7
|
class MyClass
|
7
8
|
{
|
2
静的コンストラクタの書き方が間違っていたので修正
answer
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
```C#
|
6
6
|
class MyClass
|
7
7
|
{
|
8
|
-
|
8
|
+
static MyClass() // 通常のコンストラクタの前にstaticが付く
|
9
9
|
{
|
10
10
|
}
|
11
11
|
}
|
1
修正
answer
CHANGED
@@ -29,7 +29,7 @@
|
|
29
29
|
{
|
30
30
|
get
|
31
31
|
{
|
32
|
-
lock (lockObject)
|
32
|
+
lock (lockObject) // このスコープ内は一つのスレッドしか通過できず、そのスレッドが完了するまで他のスレッドは待ち状態になる
|
33
33
|
{
|
34
34
|
if (_instance == null)
|
35
35
|
{
|
@@ -37,7 +37,6 @@
|
|
37
37
|
}
|
38
38
|
}
|
39
39
|
return _instance;
|
40
|
-
|
41
40
|
}
|
42
41
|
}
|
43
42
|
|