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

注意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

猜你喜欢

转载自blog.csdn.net/asahinokawa/article/details/81061241