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