【发布时间】:2011-03-08 16:03:45
【问题描述】:
我是多线程的新手,我编写了这段代码,它通过同时运行的线程递增并打印一个变量来打印数字 1-10000。
这是我正在使用的代码:
package threadtest;
public class Main{
static int i=0;
static Object lock=new Object();
private static class Incrementer extends Thread{
@Override
public void run(){
while (true){
synchronized(lock){
if (i>=10000)
break;
i++;
System.out.println(i);
}
}
}
}
public static void main(String[] args) {
new Incrementer().start();
new Incrementer().start();
new Incrementer().start();
new Incrementer().start();
new Incrementer().start();
new Incrementer().start();
}
}
这行得通 - 我编写了一个测试程序来检查输出,打印的数字正好是 1-10000。
我的问题是:我听说synchronized 只是语法糖。但是如果不使用它,我似乎无法取得成功的结果。我错过了什么?
【问题讨论】:
-
当然不是。你能引用你听说过的消息来源吗?
-
@BalusC:查看已接受的答案。我认为消息来源只是将同步的 methods 称为语法糖——我不确定这是否完全正确,但至少它并不像我认为的那样与我的发现相矛盾。 @skaffman:据我所知,如果没有
synchronized,我可能做错了:) -
@incrediman
synchronized在方法上与将方法主体放入synchronized (this) { ... }(或静态方法synchronized (MyClass.class) { ... })或多或少相同。 (它在类文件中的表示方式确实不同,但这通常不应该让您担心。) -
顺便说一句:由于您可能已启用 Biased Locked,(这是默认设置)一个线程将获取锁,而其他线程将进入睡眠状态。即很可能所有工作都将由一个线程完成,其余线程将等待它完成。这不是错误,在您的情况下,它是执行这些线程的最有效方式。
-
@Peter:这项工作并不是由一个线程完成的。在上面代码的一个变体中,我给每个线程一个名字,并让他们输出他们的名字和数字——工作是平等的。知道为什么会这样吗?
标签: java multithreading synchronized