多线程同步

实现两个并行执行的线程的数据同步

(使用Java同步机制)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
public class EmuExe {
public static void execute() {
try {
Thread.sleep((int) Math.random() * 1000);
} catch (Exception e) {
System.out.println("Exception!");
}
}
}


public class ThreadSync {
public static void main(String[] args) {
Object lock = new Object();
Flag flag = new Flag(true);
ThreadA thread1 = new ThreadA(lock, flag);
ThreadB thread2 = new ThreadB(lock, flag);
thread1.start();
thread2.start();
}
}
class Flag {
public boolean flag;

public Flag (boolean flag) {
this.flag = flag;
}
}

class ThreadA extends Thread {
public static volatile int A = 0;
private final Object lock;
private Flag flag;

public ThreadA(Object lock, Flag flag) {
this.lock = lock;
this.flag = flag;
}

@Override
public void run() {
for(int i = 0; i < 100; i++) {

if(ThreadA.A + ThreadB.B != 100) {
System.out.println("Error!");
}
System.out.println("the value of A is " + A);

synchronized (lock) {
flag.flag = !flag.flag;
if (flag.flag) {
lock.notify();
} else {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

incA();

if (i != 99) {
synchronized (lock) {
flag.flag = !flag.flag;
if (flag.flag) {
System.out.println("waiting A");
lock.notify();
} else {

try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}

}
}
}
}
}

private void incA() {
A++;
EmuExe.execute();
}
}

class ThreadB extends Thread {
public static volatile int B = 100;
private final Object lock;
private Flag flag;

public ThreadB(Object lock, Flag flag) {
this.lock = lock;
this.flag = flag;
}

@Override
public void run() {
for(int i = 0; i < 100; i++) {

if(ThreadA.A + ThreadB.B != 100) {
System.out.println("Error");
}

System.out.println("the value of B is " + B);
synchronized (lock) {
flag.flag = !flag.flag;
if (flag.flag) {
lock.notify();
} else {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

decB();

if (i != 99) {
synchronized (lock) {
flag.flag = !flag.flag;
if (flag.flag) {
System.out.println("waiting B");
lock.notify();
} else {

try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}

}
}
}
}
}

private void decB() {
B--;
EmuExe.execute();
}
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!