问一下各位师兄师姐:为什么我在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());
}
}
}
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());
}
}
}
无论哪个线程先运行count都是++
所以你看不出区别来
你看看线程就知道了
说不定可以看出不同。
count++可能不足够不拆分吧。
这种东西被影响的外界条件太多了。你要试验很多很多次,加大循环次数,就会看到异常情况的发生了。
System.out.println(count++);
return count;
}试试这样吧 多试几次就知道了
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
把你的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