注意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(); } } }
多次运行,可能会有不同的结果,但是子线程的输出,我认为一定是1000 。对于这样的输出,可能的执行次序是这样的:
主线程开启子线程后,便获得了实例tt
的锁,然后等m1()
执行完后,再执行m2()
,在m2()
中,首先改变b
的值到1000,然后进行休眠。注意,此时的主线程是可以继续执行的,然后转到主线程,输出main b = 1000
,因为使用了同步,所以修改对主线程可见。然后子线程再输出Thread-0 b = 1000
。