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

回答編集履歴

2

次のコードのように、排他処理を入れることで、総和が必ず50になります。

2024/09/23 05:21

投稿

JavaCommons
JavaCommons

スコア86

answer CHANGED
@@ -37,3 +37,52 @@
37
37
  }
38
38
  }
39
39
  ```
40
+
41
+ 次のコードのように、排他処理を入れることで、総和が必ず50になります。
42
+
43
+ ```java
44
+ import java.util.concurrent.locks.Lock;
45
+ import java.util.concurrent.locks.ReentrantLock;
46
+
47
+ class MyThread extends Thread {
48
+ private int count;
49
+
50
+ public MyThread(int count) {
51
+ this.count = count;
52
+ }
53
+
54
+ @Override
55
+ public void run() {
56
+ for (int i = 0; i < this.count; i++) {
57
+ ThreadDemo.lock.lock();
58
+ try {
59
+ int total = ThreadDemo.total;
60
+ try {
61
+ Thread.sleep(1);
62
+ } catch (InterruptedException e) {
63
+ ;
64
+ }
65
+ total += 1;
66
+ ThreadDemo.total = total;
67
+ } finally {
68
+ ThreadDemo.lock.unlock();
69
+ }
70
+ }
71
+ }
72
+ }
73
+
74
+ public class ThreadDemo {
75
+ public final static Lock lock = new ReentrantLock(true);
76
+ public static int total = 0;
77
+
78
+ public static void main(String[] args) throws Exception {
79
+ MyThread t1 = new MyThread(25);
80
+ MyThread t2 = new MyThread(25);
81
+ t1.start();
82
+ t2.start();
83
+ t1.join();
84
+ t2.join();
85
+ System.out.println(ThreadDemo.total);
86
+ }
87
+ }
88
+ ```

1

排他処理を・・・を追加

2024/09/23 05:06

投稿

JavaCommons
JavaCommons

スコア86

answer CHANGED
@@ -1,6 +1,6 @@
1
1
  デバッガで止めなくても・・・
2
2
  スレッド間の共有資源(共有データ)に対する競合は、Theread.sleep(ms) などをスレッドのコードに入れたりすることでも起こせますね。
3
- スレッドは独立したCPUで別々に実行しているようなものなので、共有資源(共有データ)をアクセスする場合には必ず入れた方がいいと言えます。
3
+ スレッドは独立したCPUで別々に実行しているようなものなので、共有資源(共有データ)をアクセスする場合には***排他処理を必ず入れた方がいいと言えます***
4
4
 
5
5
  以下のソースコードを実行すると、50に近い値が表示されそうですが、そうなりません。
6
6