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

u010584807 2013-05-06 12:46:53
这是我写的一段测试代码
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
该如何做?希望大家能指点一二!
...全文
2005 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
今天写一个测试代码的时候也犯了这个错误,结果网上一搜,好多犯同样错误的啊,哈哈
dai215shu 2013-05-08
  • 打赏
  • 举报
回复
public class SynchronizedCode implements Runnable {
    private int aa;

    public SynchronizedCode(int aa){
        this.aa = aa;
    }

    public void run() {
        synchronized (SynchronizedCode.class){
            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();
    }

}
@@##2000 ----2000 @@##1000 ----1000
dai215shu 2013-05-08
  • 打赏
  • 举报
回复
你那是锁对象,换成锁对象 public void run() { synchronized (SynchronizedCode.class){ ..... 就可以了
linlargy 2013-05-06
  • 打赏
  • 举报
回复
public class SynchronizedCode
    implements Runnable {
    private Integer[] cc;
    
    public void setCc(Integer[] cc) {
        this.cc = cc;
    }
    public void run() {
        for (int i =0;i<cc.length;i++) {
            synchronized (this) {
                try {
                    System.out.println("@@" + cc[i]);
                    Thread.sleep( cc[i]);
                    System.out.println("----" +  cc[i]);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        SynchronizedCode sc1 = new SynchronizedCode();
        Integer[] cc= new Integer[2];
        cc[0]=2000;
        cc[1]=1000;
        sc1.setCc(cc);
        Thread thread1 = new Thread(sc1);
        thread1.start();
    }
}
@@2000 //休眠2000 ----2000 @@1000 //休眠1000 ----1000
zhangxiao1228 2013-05-06
  • 打赏
  • 举报
回复
楼主请看 http://bbs.csdn.net/topics/390448793
u010584807 2013-05-06
  • 打赏
  • 举报
回复
引用 1 楼 peng_hao1988 的回复:

 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要是同一个对象才行,需要将对象从类的外面传进去,你在这里写死,它永远不可能时同一个对象。
还是林妹妹博学多才啊!
zhangxiao1228 2013-05-06
  • 打赏
  • 举报
回复
楼主,你锁的是当前对象,也就是说你锁的是两个对象,所以根本没有影响
andycpp 2013-05-06
  • 打赏
  • 举报
回复
上锁是踢足球,22个人抢一个球 你这是大型团体操,每个表演者发一个球,大家不用抢,哈哈
famosssss 2013-05-06
  • 打赏
  • 举报
回复
锁得多个线程访问同一个对象的代码块才起作用。。你这个是多个线程,各自访问各自的对象。。。。
桃园闲人 2013-05-06
  • 打赏
  • 举报
回复

 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要是同一个对象才行,需要将对象从类的外面传进去,你在这里写死,它永远不可能时同一个对象。

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧