当前位置: 代码迷 >> Java Web开发 >> java线程中加入synchronized锁住步骤,但无效,请看代码
  详细解决方案

java线程中加入synchronized锁住步骤,但无效,请看代码

热度:8   发布时间:2016-04-13 22:17:55.0
java线程中加入synchronized锁住方法,但无效,请看代码
这是我写的一段测试代码
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
  相关解决方案