一个简单的线程问题

boilin 2008-02-25 10:39:31
问一下各位师兄师姐:为什么我在getCount()前面加上synchronized或者不加,得到的输出结果顺序都是正确的,以我对线程的理解,如果不加synchronized得到的结果顺序应该是有点混乱的?可是并没有出现.这是为什么?高手指点一下!

class AddCount{
int count=0;
public synchronized int getCount(){
return count++;
}
}

public class TestCountThread{
AddCount ac=new AddCount();
public static void main(String[] args){
TestCountThread tct=new TestCountThread();
for(int i=1;i<10;i++){
tct.new CountThread().start();
tct.new CountThread().start();
tct.new CountThread().start();
tct.new CountThread().start();
}
}
class CountThread extends Thread{
public void run(){
System.out.println(ac.getCount());
}
}
}
...全文
180 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
figoren 2008-02-26
  • 打赏
  • 举报
回复
不加synchronized
把你的System.out.println(ac.getCount())改成
System.out.println(Thread.currentThread().getName()+":"+ac.getCount());
得到结果
Thread-0:0
Thread-1:1
Thread-4:3
Thread-3:2
Thread-5:4
Thread-7:6
Thread-2:5
Thread-9:7
Thread-11:8
Thread-13:9
Thread-6:10
加上后得到
Thread-1:0
Thread-0:1
Thread-3:2
Thread-5:3
Thread-7:4
Thread-9:5
Thread-2:6
Thread-11:7
Thread-6:8
Thread-13:9
Thread-8:10
boilin 2008-02-25
  • 打赏
  • 举报
回复
那怎样才能实现正确的输出顺序呢?
dracularking 2008-02-25
  • 打赏
  • 举报
回复
像楼主这样code加不加synchronized确实都可能是乱的(测试第三次出现混乱结果)

public synchronized int getCount() {
System.out.println(count++);
return count;
}


试试这样吧 多试几次就知道了
healer_kx 2008-02-25
  • 打赏
  • 举报
回复
几次的情况说明不了问题,

我同样的多线程的机器,在迅驰的本上就好好的不出事情,在我家里AMD的双核的机器上就不行。
这种东西被影响的外界条件太多了。你要试验很多很多次,加大循环次数,就会看到异常情况的发生了。
boilin 2008-02-25
  • 打赏
  • 举报
回复
可是我运行了几次都吗得到乱的 为什么 呢 ?
healer_kx 2008-02-25
  • 打赏
  • 举报
回复
这个顺序不可以强求的。加不加都可能是乱的。
forestking_xx 2008-02-25
  • 打赏
  • 举报
回复
你不如改成 System.out.println(“before”);count = count + 1; System.out.println("after");
说不定可以看出不同。
count++可能不足够不拆分吧。
枫叶rain 2008-02-25
  • 打赏
  • 举报
回复
你看到的只是count
无论哪个线程先运行count都是++
所以你看不出区别来
你看看线程就知道了
ronry2 2008-02-25
  • 打赏
  • 举报
回复
anod正解
healer_kx 2008-02-25
  • 打赏
  • 举报
回复
在多个机器上实验才能下结论.
boilin 2008-02-25
  • 打赏
  • 举报
回复
到底是这么回事啊?怎么dracularking 和 anod两位师兄说的完全相反的啊?一个说会乱序,一个说不会,我该信谁的啊?哪位高手能否用简单的回答说明一下!
anod 2008-02-25
  • 打赏
  • 举报
回复
你的程序无论怎样都不会乱续,因为永远只对一个count做++,无论哪个线程都做一样的工作,打印结果必然不会乱。而且,+=这样的操作是原子操作,不存在同步问题。因此不用加关键字synchronized。

可以这么写一个来观察:
public class Test
{
public static void main(String s[])
{
MyThread mt1 = new MyThread(1);
MyThread mt2 = new MyThread(2);
MyThread mt3 = new MyThread(3);
mt1.start();
mt2.start();
mt3.start();
}
}

class MyThread extends Thread
{
int id = 0;

int count = 0;

public MyThread(int id)
{
this.id = id;
}

public void run()
{
while (true)
{
System.out.println("Thread " + id + " " + count++);
}
}
}
通过观察结果可以知道3个线程并不是平均获得CPU时间的。
一段结果:
Thread 1 34374
Thread 1 34375
Thread 3 35065
Thread 2 23190
Thread 1 34376
Thread 3 35066
Thread 2 23191
Thread 1 34377
Thread 3 35067
Thread 2 23192
Thread 1 34378

62,623

社区成员

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

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