teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

6

修正

2016/10/25 04:26

投稿

ishi9
ishi9

スコア1294

answer CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  今回の件の要点は、スレッドセーフの話です。
16
16
 
17
- スレッドセーフな作りになってないので、複数のスレッドでAssetが同時に呼ばれると最初の_instanceのnewが終わるまでの間にスレッドがif文をすり抜けてしまう事が起こり得ます。
17
+ スレッドセーフな作りになってないので、複数のスレッドでAssetが同時に呼ばれると最初の_instanceのnewが終わるまでの間に他のスレッドがif文をすり抜けてしまう事が起こり得ます。
18
18
  (newが完了するまで_instanceはnullのままなので)
19
19
 
20
20
  解決方法はいろいろあります。

5

修正

2016/10/25 04:26

投稿

ishi9
ishi9

スコア1294

answer CHANGED
@@ -14,7 +14,8 @@
14
14
 
15
15
  今回の件の要点は、スレッドセーフの話です。
16
16
 
17
- スレッドセーフな作りになってないので、複数のスレッドでAssetが同時に呼ばれると_instanceがNULLの間に各スレッドがif文をすり抜けているのだと思われます。
17
+ スレッドセーフな作りになってないので、複数のスレッドでAssetが同時に呼ばれると最初の_instanceのnew終わるまでの間に各スレッドがif文をすり抜けてう事が起こり得ます。
18
+ (newが完了するまで_instanceはnullのままなので)
18
19
 
19
20
  解決方法はいろいろあります。
20
21
  例としてロックオブジェクトを使うやり方を紹介します。

4

修正

2016/10/25 04:25

投稿

ishi9
ishi9

スコア1294

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

静的コンストラクタ補足追加

2016/10/25 04:22

投稿

ishi9
ishi9

スコア1294

answer CHANGED
@@ -2,6 +2,7 @@
2
2
  静的コンストラクタを勘違いされているようです。
3
3
  静的コンストラクタとは以下のような書き方をするもので、
4
4
  プログラム全体で数えて初めてそのクラスが作られた時に一度だけ実行されます。
5
+ 追記:staticメンバが初めて参照される場合でも呼ばれるようです。その場合でもプログラム全体で実行されるのは一度だけです。
5
6
  ```C#
6
7
  class MyClass
7
8
  {

2

静的コンストラクタの書き方が間違っていたので修正

2016/10/25 04:18

投稿

ishi9
ishi9

スコア1294

answer CHANGED
@@ -5,7 +5,7 @@
5
5
  ```C#
6
6
  class MyClass
7
7
  {
8
- public static MyClass()
8
+ static MyClass() // 通常のコンストラクタの前にstaticが付く
9
9
  {
10
10
  }
11
11
  }

1

修正

2016/10/25 04:16

投稿

ishi9
ishi9

スコア1294

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