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

回答編集履歴

2

編集コード

2017/05/19 03:58

投稿

shafi_bo
shafi_bo

スコア20

answer CHANGED
@@ -4,3 +4,54 @@
4
4
  逆に質問しますが、同時に[0][1][2][3]が同じ値のcounterを取得するということでいいんでしょうか?
5
5
  それとも[0] = 0, [1] = 1, [2] = 2, [3] = 3, [0] = 4, [1] = 5.....といったかんじでしょうか?
6
6
 
7
+ 無理やりずらしてみました。
8
+
9
+ ```ここに言語を入力
10
+ public class StartApp extends Thread {
11
+
12
+ static int counter;
13
+ private int id;
14
+
15
+ StartApp(int id) {
16
+ this.id = id;
17
+ }
18
+
19
+ public synchronized void run() {
20
+ while (true) {
21
+ System.out.println(id + ":" + counter);
22
+ counter++;
23
+ try {
24
+ Thread.sleep(1000);
25
+ } catch (InterruptedException e) {
26
+ // TODO 自動生成された catch ブロック
27
+ e.printStackTrace();
28
+ }
29
+
30
+ }
31
+ }
32
+
33
+ public static void main(String[] args) {
34
+ // TODO Auto-generated method stub
35
+ Thread t[] = new Thread[4];
36
+ for (int i = 0; i < 4; i++) {
37
+ t[i] = new Thread(new StartApp(i));
38
+ }
39
+ try{
40
+ t[0].start();
41
+ Thread.sleep(100);
42
+ t[1].start();
43
+ Thread.sleep(100);
44
+ t[2].start();
45
+ Thread.sleep(100);
46
+ t[3].start();
47
+ Thread.sleep(100);
48
+ } catch (InterruptedException e){
49
+
50
+ }
51
+ }
52
+
53
+
54
+ ```
55
+
56
+ 各スレッドの生成を遅らせて生成を試みてみました。
57
+ 正直無理やり感がぬぐえないのとテスト回数が少ないので正しいかどうかはわかりませんが一応貼っておきます。

1

質問

2017/05/19 03:58

投稿

shafi_bo
shafi_bo

スコア20

answer CHANGED
@@ -1,2 +1,6 @@
1
1
  スレッドは、一つ一つ処理速度が違います。
2
- なので、counterをアクセス時に他スレッドで足された後にアクセスするケースがズレにあたると思われます。
2
+ なので、counterをアクセス時に他スレッドで足された後にアクセスするケースがズレにあたると思われます。
3
+
4
+ 逆に質問しますが、同時に[0][1][2][3]が同じ値のcounterを取得するということでいいんでしょうか?
5
+ それとも[0] = 0, [1] = 1, [2] = 2, [3] = 3, [0] = 4, [1] = 5.....といったかんじでしょうか?
6
+