这是我写的一段测试代码
public class SynchronizedCode implements Runnable {
private int aa;
public SynchronizedCode(int aa){
this.aa = aa;
}
public void run() {
synchronized (this){
try {
System.out.println("@@"+aa);
Thread.sleep(aa);
System.out.println("----"+aa);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args){
SynchronizedCode sc1 = new SynchronizedCode(2000);
SynchronizedCode sc2 = new SynchronizedCode(1000);
Thread thread1 = new Thread(sc1);
Thread thread2 = new Thread(sc2);
thread1.start();
thread2.start();
}
}
运行main方法后,打印的结果为:
@@1000
@@2000
----1000
----2000
为什么?
有synchronized 包住的代码块,应该是等第一个执行完了,第二个才能执行啊?
我想的结果应该是:
@@1000
----1000
@@2000
----2000
很奇怪啊!
如果说想输出为:
@@1000
----1000
@@2000
----2000
该如何做?希望大家能指点一二!
------解决思路----------------------
SynchronizedCode sc1 = new SynchronizedCode(2000);
SynchronizedCode sc2 = new SynchronizedCode(1000);
Thread thread1 = new Thread(sc1);
Thread thread2 = new Thread(sc2);
thread1.start();
thread2.start();
老兄!你这是两个不同的线程,不同的SynchronizedCode 对象,各跑各的没有问题呀。
synchronized (this)这里的this要是同一个对象才行,需要将对象从类的外面传进去,你在这里写死,它永远不可能时同一个对象。
------解决思路----------------------
锁得多个线程访问同一个对象的代码块才起作用。。你这个是多个线程,各自访问各自的对象。。。。
------解决思路----------------------
上锁是踢足球,22个人抢一个球
你这是大型团体操,每个表演者发一个球,大家不用抢,哈哈
------解决思路----------------------
楼主,你锁的是当前对象,也就是说你锁的是两个对象,所以根本没有影响
------解决思路----------------------
楼主请看
http://bbs.csdn.net/topics/390448793