当前位置: 代码迷 >> J2SE >> java多线程,锁定有关问题
  详细解决方案

java多线程,锁定有关问题

热度:244   发布时间:2016-04-24 02:24:28.0
【求助】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了
  相关解决方案