【代码如下:】
- 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了