帮我看看这段线程同步代码

来源:百度知道 编辑:UC知道 时间:2024/07/04 06:26:22
class ThreadTest implements Runnable{
private Integer count = 0;
public void run(){
synchronized(count){
count ++;
System.out.println(Thread.currentThread().getName() + " count="+count);
}
}
}
public class Test {
public static void main(String[] args) {
ThreadTest tt = new ThreadTest();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
}

}
这段程序为什么还会出现线程安全问题,它打印出的count有重复的值,这是怎么回事

拜托,这肯定会重复的。因为这些线程各自有一个count,既然是各自有个count,既然不会存在竞争关系了。所以你这个程序是错的。
可以这样改:
class Count {
private Count instance = null; //指向该类的实例对象的引用
private int count = 0;

private Count() {}

/** 进行一次计数*/
public void count(Thread t) {
synchronized(count){
count ++;
System.out.println(t.getName() + " count="+count);
}
}

/** 获取计数类的实例对象的引用,若没有创建,则创建一个对象*/
public static Count getInstance () {
synchronized(this) {
if (instance == null)
instance = new Count();
return instance;
}
}
}

class CountThread extends Thread {
public void run() {
while(true) {
Count.getInstance().count(this);
}
}
}

class Test {
public static void main(String[] args) {
new CountThread("th