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
|
package
com.java1234.chap09.sec05;
public
class
Thread1
implements
Runnable{
private
int
baoZi=
1
;
private
String threadName;
public
Thread1(String threadName) {
super
();
this
.threadName = threadName;
}
@Override
public
void
run() {
while
(baoZi<=
10
){
System.out.println(threadName+
" 吃第"
+baoZi+
"个包子"
);
baoZi++;
}
}
public
static
void
main(String[] args) {
Thread1 t1=
new
Thread1(
"超级张三线程"
);
Thread t11=
new
Thread(t1);
Thread t12=
new
Thread(t1);
Thread t13=
new
Thread(t1);
t11.start();
t12.start();
t13.start();
}
}
|
运行输出:
超级张三线程 吃第1个包子
超级张三线程 吃第1个包子
超级张三线程 吃第2个包子
超级张三线程 吃第3个包子
超级张三线程 吃第4个包子
超级张三线程 吃第5个包子
超级张三线程 吃第6个包子
超级张三线程 吃第7个包子
超级张三线程 吃第8个包子
超级张三线程 吃第9个包子
超级张三线程 吃第11个包子
超级张三线程 吃第8个包子
我们发现 会有多个线程同时进入方法吃包子的情况发生,这时候,就引入了线程同步。可以给方法加同步,同一时刻,只允许一个线程进入方法;
关键字 synchronized
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
|
package
com.java1234.chap09.sec05;
public
class
Thread3
implements
Runnable{
private
int
baoZi=
1
;
private
String threadName;
public
Thread3(String threadName) {
super
();
this
.threadName = threadName;
}
@Override
public
synchronized
void
run() {
while
(baoZi<=
10
){
System.out.println(threadName+
" 吃第"
+baoZi+
"个包子"
);
baoZi++;
}
}
public
static
void
main(String[] args) {
Thread3 t1=
new
Thread3(
"超级张三线程"
);
Thread t11=
new
Thread(t1);
Thread t12=
new
Thread(t1);
Thread t13=
new
Thread(t1);
t11.start();
t12.start();
t13.start();
}
}
|
运行输出:
超级张三线程 吃第1个包子
超级张三线程 吃第2个包子
超级张三线程 吃第3个包子
超级张三线程 吃第4个包子
超级张三线程 吃第5个包子
超级张三线程 吃第6个包子
超级张三线程 吃第7个包子
超级张三线程 吃第8个包子
超级张三线程 吃第9个包子
超级张三线程 吃第10个包子
也可以用同步块:
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
|
package
com.java1234.chap09.sec05;
public
class
Thread4
implements
Runnable{
private
int
baoZi=
1
;
private
String threadName;
public
Thread4(String threadName) {
super
();
this
.threadName = threadName;
}
@Override
public
void
run() {
/**
* 同步块
*/
synchronized
(
this
) {
while
(baoZi<=
10
){
System.out.println(threadName+
" 吃第"
+baoZi+
"个包子"
);
baoZi++;
}
}
}
public
static
void
main(String[] args) {
Thread4 t1=
new
Thread4(
"超级张三线程"
);
Thread t11=
new
Thread(t1);
Thread t12=
new
Thread(t1);
Thread t13=
new
Thread(t1);
t11.start();
t12.start();
t13.start();
}
}
|
运行结果一样;