这两个线程方式有什么区别高手帮忙
package icrement;public class Counter { protected  long value = 0; public  long getValue() {
return value;
}
public   long   increase(){
synchronized (this) {
this.value += 10;
return value;
}
}
}
package icrement;public class Thread1 extends Thread{
private volatile Counter counter ;
public Thread1(Counter counter){
this.counter = counter;
}
@Override 
public void run(){
//synchronized (counter) {
//System.out.println(counter.value+=10);
//}
System.out.println(this.counter.increase());
}
}
还有一个
package icrement;public class Counter { protected  long value = 0; public  long getValue() {
return value;
}
public   long   increase(){
//synchronized (this) {
this.value += 10;
return value;
//}
}
}package icrement;public class Thread1 extends Thread{
private volatile Counter counter ;
public Thread1(Counter counter){
this.counter = counter;
}
@Override 
public void run(){
synchronized (counter) {
//System.out.println(counter.value+=10);
System.out.println(this.counter.increase());
}

}
}
就是把线程同步块放到run里面和不放到里面的区别 

解决方案 »

  1.   

    线程运行的时候就会调用run()方法啊如果不放在run()里面怎么运行啊
      

  2.   

    由于+10不是原子操作,不同步的话,多线程并发操作counter可能导致不正确的结果
      

  3.   

    就楼主目前的程序看,两个无任何区别。但对第二个而言,如果有其他线程(不是 public class Thread1 extends Thread这个),直接操作Counter的increase方法,就有问题。故第一个更好。另外,个人认为getValue方法也要同步起来。
      

  4.   


    第一个更好,因为它遵循了尽量减少锁定对象时间的原则。
    第二个要一直等到println()结束才会释放锁,而第一个加法执行完就释放锁了