java多线程

genguyige 2011-07-19 12:18:01
这两个线程方式有什么区别

高手帮忙


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里面和不放到里面的区别
...全文
82 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞跃颠峰 2011-07-19
  • 打赏
  • 举报
回复
由于+10不是原子操作,不同步的话,多线程并发操作counter可能导致不正确的结果
luoluo11108 2011-07-19
  • 打赏
  • 举报
回复
线程运行的时候就会调用run()方法啊

如果不放在run()里面怎么运行啊


飞跃颠峰 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 genguyige 的回复:]

引用 2 楼 alexandertech 的回复:

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


我说的是同步块放在不同的地方的区别是什么?
[/Quote]

第一个更好,因为它遵循了尽量减少锁定对象时间的原则。
第二个要一直等到println()结束才会释放锁,而第一个加法执行完就释放锁了
Mybeautiful 2011-07-19
  • 打赏
  • 举报
回复
就楼主目前的程序看,两个无任何区别。

但对第二个而言,如果有其他线程(不是 public class Thread1 extends Thread这个),直接操作Counter的increase方法,就有问题。故第一个更好。

另外,个人认为getValue方法也要同步起来。
genguyige 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 alexandertech 的回复:]

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

我说的是同步块放在不同的地方的区别是什么?

62,612

社区成员

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

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