iteye_4953 2013-01-29 22:20
浏览 229
已采纳

我是新人,关于Java线程的问题,很简单的例子,可是我就是调不出来,不知道哪里错了

我想试一下synchronized关键字是不是有效?所以写了一个很简单的类,但是就是不能调到数字按序排列。不知道错在哪里了。

数字序列类:
[code="java"]
package com.testthread;

public class UnsafeSequence {
private int value = 0;
public synchronized int getValue(){
value = value+1;
return value;
}
}
[/code]

线程类
[code="java"]
package com.testthread;

public class TestThread extends Thread {
private UnsafeSequence us;

public TestThread(UnsafeSequence us, String threadname) {
    super(threadname);
    this.us = us;
}

@Override
public void run() {
    String classname = this.getClass().getSimpleName();
    String threadname = currentThread().getName();
    for (int i = 0; i < 5; i++) {
        System.out.println(classname + "[" + threadname + "]:"
                + us.getValue());
    }
}

}
[/code]

Main类
[code="java"]
package com.testthread;

public class MainClass {
public static void main(String[] args) throws InterruptedException {
System.out.println("Main started");
UnsafeSequence us = new UnsafeSequence();
TestThread at = new TestThread(us,"at");
TestThread bt = new TestThread(us,"bt");

    at.start();
    bt.start();
    System.out.println("Main ended");
}

}
[/code]

可是结果是:
[code="java"]
Main started
Main ended
TestThread[bt]:2
TestThread[bt]:3
TestThread[at]:1
TestThread[at]:5
TestThread[at]:6
TestThread[at]:7
TestThread[at]:8
TestThread[bt]:4
TestThread[bt]:9
TestThread[bt]:10
[/code]

我想让数字按序排列,可是数字没有按序排列,请问哪里写错了,谢谢

  • 写回答

4条回答 默认 最新

  • hadeslbf 2013-01-29 23:55
    关注

    你真要输出1-10的话,应该在UnsafeSequence.getValue里面输出value的值,肯定就是1-10了,因为System.out.println的执行和getValue的执行是两个方法的调用,getValue方法调用返回以后,不一定它就马上执行了System.out.println,因为这个时候可能又转到别的线程执行去了,加synchronized唯一能保证的是,getValue无论多少个线程同时调用,他一定会序列化执行,也就是在这里输出value的值,一定是递增的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?
  • ¥15 matlab(相关搜索:紧聚焦)
  • ¥15 基于51单片机的厨房煤气泄露检测报警系统设计
  • ¥15 Arduino无法同时连接多个hx711模块,如何解决?