日期:2014-05-20  浏览次数:20612 次

【求助】java多线程,锁定问题
【代码如下:】
Java code
public class TestThread {
    public static void main(String[] args) {
        Runner r1 = new Runner();
        r1.flag = 1; //标示,运行m1方法
        Thread t1 = new Thread(r1);
        t1.start();
        
        Runner r2 = new Runner();
        r2.flag = 2; //标示,运行m2方法
        Thread t2 = new Thread(r2);
        t2.start();
    }
}
class Runner implements Runnable {
    static String str = "哈哈";
    int flag = 0;
    public void run() {
        try {
            if(flag == 1) {
                m1();
            }
            if(flag == 2) {
                m2();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void m1() throws Exception {
        synchronized(str) {
        str = "m1";
        Thread.sleep(1000);
        System.out.println("1:" + str);
        }
    }
    public void m2() throws Exception {
        synchronized(str) {
        str = "m2";
        Thread.sleep(1000);
        System.out.println("2:" + str);
        }
    }
}

【运行结果:】
2:m2
1:m2
【我的理解:】
首先t1线程运行,m1方法中 synchronized 锁定住了静态的字符串str,str = "m1",t1进入睡眠中;
t2线程运行时,m2方法中,因为str被锁定,所以无法运行,直到str解锁即m1运行结束;
m1结束,输出 1:m1;
m2继续运行,输出 2:m2。


为什么结果和我想的不一样啊?小弟刚刚开始学习,不太了解,求高人指点,谢谢!

------解决方案--------------------
public void m1() throws Exception {
synchronized(str) {
str = "m1";
Thread.sleep(1000);
System.out.println("1:" + str);
}
}
首先你进来str="哈哈"
立刻把str="m1",线程1是获得了"哈哈"这个管程

在线程2执行到synchronized(str)之前,str已经被修改成了"m1"这个时候,线程2获取了"m1"这个管程,因为2个线程并不同步在一个资源上,所以不会有锁竞争的关系,线程2立刻执行将str="m2",在线程1 睡完觉之前,str早被改成m2了