java多线程(一个类中的两个同步方法)

时间:2016-02-26 05:30:02

标签: java multithreading

我实现了下面的类并得到了这个输出:

dsfs2000  
2000  
b = 1000;

我想知道为什么不是:

b = 1000;  
dsfs2000  
2000

由于t.start()会先调用m1()m2()应该等到m1()完成,为什么m2()实际上会先获得锁定?

public class TT implements Runnable {
    int b = 100;

    public synchronized void m1() throws Exception{
        //Thread.sleep(2000);
        b = 1000;
        //Thread.sleep(5000);
        System.out.println("b = " + b);
    }

    public synchronized void m2() throws Exception {

        Thread.sleep(2500);
        b = 2000;
        System.out.println("dsfs" + b);
    }

    public void run() {
        try {
            m1();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
        TT tt = new TT();
        Thread t = new Thread(tt);

        t.start();
        tt.m2();

        System.out.println(tt.b);
    }
}

3 个答案:

答案 0 :(得分:0)

在您的代码中

    t.start();  // has to go through the overhead of creating a Thread and calling back its `run`

    tt.m2();   // just calling a method on a already created Object, which is really fast

答案 1 :(得分:0)

m1()方法中,在结尾添加notify();,在第一个m2()添加wait();,然后就可以了。

这是完整的代码:我已经更改了两个地方。评论为// here

public class TT implements Runnable {
    int b = 100;

    public synchronized void m1() throws Exception{
        //Thread.sleep(2000);
        b = 1000;
        //Thread.sleep(5000);
        System.out.println("b = " + b);
        notify(); // here
    }

    public synchronized void m2() throws Exception {
        wait(); // here
        Thread.sleep(2500);
        b = 2000;
        System.out.println("dsfs" + b);
    }

    public void run() {
        try {
            m1();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
        TT tt = new TT();
        Thread t = new Thread(tt);

        t.start();
        tt.m2();

        System.out.println(tt.b);
    }
}

这是你想要的输出:

b = 1000
dsfs2000
2000

说明 m2()将等到m1()完成作业并通知m2();

答案 2 :(得分:0)

回答您的问题:您的main方法在您的应用程序的主线程中执行。在调用t.start();时,您要求JVM组成一个新线程并执行Runable。这同时发生,也需要一些时间。调用start方法不会阻止主线程继续执行代码。因此,tt.m2()被调用。在JVM创建新线程时,执行runnable的星星会打印出sysouts的{​​{1}}。想象这种行为。您可以将当前时间添加到runnable