返回信息流rt,刚刚看java的多线程,对运行结果好诧异!!!代码如下:
public class App {
public static void main(String[] args) {
System.out.println("Hello World!");
Test t1 = new Test("1", 1);
t1.start();
Test t2 = new Test("2", 2);
t2.start();
Test t3 = new Test("3", 3);
t3.start();
}
}
class Test extends Thread {
private static String lock = "0";
private int age;
public Test(String lock, int age) {
Test.lock = lock;
this.age = age;
}
public void printAge() {
synchronized (lock) {
while (true) {
System.out.println(Thread.currentThread().getName() + ":age="
+ age + ",lock=" + lock);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public void run() {
printAge();
}
}
为什么会有时候出现这样的运行结果呢,已经while(true)了,一旦一个线程占有了后又不会释放lock,为啥能出现两个线程交替执行的现象呢,结果如下。。。
Hello World!
Thread-0:age=1,lock=3
Thread-2:age=3,lock=3
Thread-2:age=3,lock=3
Thread-0:age=1,lock=3
Thread-0:age=1,lock=3
Thread-2:age=3,lock=3
Thread-0:age=1,lock=3
Thread-2:age=3,lock=3
Thread-0:age=1,lock=3
Thread-2:age=3,lock=3
求各位大神帮忙,感激不尽~~~
这是一条镜像帖。来源:北邮人论坛 / java / #34779同步于 2014/9/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
Java多实例多线程同步加锁的问题
Sara2009
2014/9/19镜像同步12 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
点赞!回答得简单明了!
【 在 nuanyangyang 的大作中提到: 】
: 他们看到的不是同一把锁。你的lock是static的,但是整个程序里被写了3次。
求暖神 为啥每次只有2个age打印 不是三个随机出来
【 在 nuanyangyang 的大作中提到: 】
: 他们看到的不是同一把锁。你的lock是static的,但是整个程序里被写了3次。
【 在 nuanyangyang 的大作中提到: 】
: 他们看到的不是同一把锁。你的lock是static的,但是整个程序里被写了3次。
求详细一点点的解释哇,大神。。。。求教
【 在 lanlanmao 的大作中提到: 】
: 求详细一点点的解释哇,大神。。。。求教
就是你锁上门上厕所的时候,工人来把你的厕所门撬了,换了一把新锁。然后另一个人一拉门发现没锁,就进去了,发现你在里面呢。
求暖神,既然lock是static的,那t1,t2,t3看到的锁,不都是锁的同一个lock?
new出来一个新的实例可以改变lock的值,同时破坏了这把锁?不太明白....
我自己测了几次,结果都显示只有一个线程可以执行...
【 在 nuanyangyang 的大作中提到: 】
: 他们看到的不是同一把锁。你的lock是static的,但是整个程序里被写了3次。
【 在 lllavici 的大作中提到: 】
: 求暖神,既然lock是static的,那t1,t2,t3看到的锁,不都是锁的同一个lock?
为什么是static的就一定是同一把锁?Java里,每一个对象里都有一把锁,锁其实在那三个字符串里。
: new出来一个新的实例可以改变lock的值,同时破坏了这把锁?不太明白....
旧的锁还在,你只是让lock指向了新的锁。
: 我自己测了几次,结果都显示只有一个线程可以执行...
巧合。
多谢~
【 在 nuanyangyang 的大作中提到: 】
:
: 为什么是static的就一定是同一把锁?Java里,每一个对象里都有一把锁,锁其实在那三个字符串里。
:
: ...................