Java多线程系列(1)对一个多线程同步代码的分析

注意synchronized关键字使用的是实例锁即可。即m1()m2()是按照某个次序执行,所以在m1()中,一定会输出b = 1000。至于主线程中的输出,则需要考虑执行顺序。

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
package basic.multithread;

public class TestSync2 implements Runnable {

int b = 100;

synchronized void m1() throws InterruptedException {
b = 1000;
Thread.sleep(500);
System.out.println(Thread.currentThread().getName() + " b = " + b);
}

synchronized void m2() throws InterruptedException {
Thread.sleep(250);
b = 2000;
}

public static void main(String[] args) throws InterruptedException {
TestSync2 tt = new TestSync2();

Thread t = new Thread(tt);
t.start();

tt.m2();
System.out.println(Thread.currentThread().getName() + " b = " + tt.b);
}

@Override
public void run(){
try {
m1();
} catch (InterruptedException e){
e.printStackTrace();
}
}
}

/* 我的输出是:
main b = 1000
Thread-0 b = 1000
*/

多次运行,可能会有不同的结果,但是子线程的输出,我认为一定是1000。对于这样的输出,可能的执行次序是这样的:

主线程开启子线程后,便获得了实例tt的锁,然后等m1()执行完后,再执行m2(),在m2()中,首先改变b的值到1000,然后进行休眠。注意,此时的主线程是可以继续执行的,然后转到主线程,输出main b = 1000,因为使用了同步,所以修改对主线程可见。然后子线程再输出Thread-0 b = 1000

Java多线程系列(1)对一个多线程同步代码的分析

https://eucham.me/2018/07/17/b1c1fc966e44.html

作者

遇寻

发布于

2018-07-17

更新于

2022-04-21

许可协议

评论