大家帮忙看下,如此代码在多线程下是否能兼顾效率和稳定呢?

大板牙花生 2014-06-03 09:57:23
因为对多线程不熟悉。所以写了如下代码。

即多线程下 单例模式,能够高并发相应修改内容,对已修改的内容能够实时显示。不知道代码有什么问题。
isOnChanged 总觉的是多余,是吧??


private final static SpoutIntel siInstance = new SpoutIntel();
private int spoutNowSum =0;
private volatile boolean isOnChanged =false;

private SpoutIntel(){}

public synchronized static getInstance(){
return siInstance;
}

public void set(int s){
synchronized( spoutNowSum )
{
isOnChanged = true;
spoutNowSum = s;
isOnChanged = false;
spoutNowSum.notifyAll();
}

}

public int get(){

synchronized( spoutNowSum ){
while(isOnChanged){
spoutNowSum.wait();
}
return spoutNowSum;
}

}

...全文
121 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
致知Fighting 2014-06-03
  • 打赏
  • 举报
回复
引用 10 楼 wter26 的回复:
[quote=引用 9 楼 ygycomon 的回复:] [quote=引用 8 楼 wter26 的回复:] [quote=引用 6 楼 ygycomon 的回复:] [quote=引用 4 楼 wter26 的回复:] [quote=引用 3 楼 ygycomon 的回复:] [quote=引用 2 楼 wter26 的回复:] [quote=引用 1 楼 ygycomon 的回复:] 至少在这段代码里是多余的,因为isOnChanged 在get方法里永远不会是true
我是这样想的,在多线程当中使用单例模式,如果别的线程中的get与set产生了竞争条件,有没有可能正好是取数据的时候为正在修改的时候,或者高手给指点下,代码该如何修改。[/quote] get和set都在spoutNowSum 上加了锁,这里是同步操作,消除了竞争条件,一次性只有一个线程在get或set,所以不存在数据没修改完就有线程来取[/quote] 额。。。这个倒是,如果set的同时,又get了,又没有wait,那么线程会不会发生阻塞呢?该如何解决? [/quote] get的时候isOnChanged不可能为true,那个wait的方法不会被执行到的,单纯要保证getset的安全,不用这个复杂,直接在方法上加synchronized就好了,其他的代码都可以去掉[/quote] 受教了。。。仿佛明白了什么。但是如果遇到阻塞的时候会怎样,[/quote] 遇到阻塞时不怎么样,效率和安全是一对矛盾体,你要保证效率就要并行,要并行就必然有安全问题;你要安全就要串行,所有逻辑全部串行就绝对安全但是牺牲效率。 所以在某些场景下,牺牲效率是没有办法的。不过好在对于一般的系统而言,性能瓶颈都不会出现在这种阻塞/不阻塞的权衡上,建议你也不要在这种问题上纠结,没有意义[/quote] 大师受教了。。。给点学习方法和参考书籍[/quote] 性能与安全这一块还是经验相关,接触得多了慢慢就比较熟悉了
大板牙花生 2014-06-03
  • 打赏
  • 举报
回复
引用 9 楼 ygycomon 的回复:
[quote=引用 8 楼 wter26 的回复:] [quote=引用 6 楼 ygycomon 的回复:] [quote=引用 4 楼 wter26 的回复:] [quote=引用 3 楼 ygycomon 的回复:] [quote=引用 2 楼 wter26 的回复:] [quote=引用 1 楼 ygycomon 的回复:] 至少在这段代码里是多余的,因为isOnChanged 在get方法里永远不会是true
我是这样想的,在多线程当中使用单例模式,如果别的线程中的get与set产生了竞争条件,有没有可能正好是取数据的时候为正在修改的时候,或者高手给指点下,代码该如何修改。[/quote] get和set都在spoutNowSum 上加了锁,这里是同步操作,消除了竞争条件,一次性只有一个线程在get或set,所以不存在数据没修改完就有线程来取[/quote] 额。。。这个倒是,如果set的同时,又get了,又没有wait,那么线程会不会发生阻塞呢?该如何解决? [/quote] get的时候isOnChanged不可能为true,那个wait的方法不会被执行到的,单纯要保证getset的安全,不用这个复杂,直接在方法上加synchronized就好了,其他的代码都可以去掉[/quote] 受教了。。。仿佛明白了什么。但是如果遇到阻塞的时候会怎样,[/quote] 遇到阻塞时不怎么样,效率和安全是一对矛盾体,你要保证效率就要并行,要并行就必然有安全问题;你要安全就要串行,所有逻辑全部串行就绝对安全但是牺牲效率。 所以在某些场景下,牺牲效率是没有办法的。不过好在对于一般的系统而言,性能瓶颈都不会出现在这种阻塞/不阻塞的权衡上,建议你也不要在这种问题上纠结,没有意义[/quote] 大师受教了。。。给点学习方法和参考书籍
致知Fighting 2014-06-03
  • 打赏
  • 举报
回复
引用 8 楼 wter26 的回复:
[quote=引用 6 楼 ygycomon 的回复:] [quote=引用 4 楼 wter26 的回复:] [quote=引用 3 楼 ygycomon 的回复:] [quote=引用 2 楼 wter26 的回复:] [quote=引用 1 楼 ygycomon 的回复:] 至少在这段代码里是多余的,因为isOnChanged 在get方法里永远不会是true
我是这样想的,在多线程当中使用单例模式,如果别的线程中的get与set产生了竞争条件,有没有可能正好是取数据的时候为正在修改的时候,或者高手给指点下,代码该如何修改。[/quote] get和set都在spoutNowSum 上加了锁,这里是同步操作,消除了竞争条件,一次性只有一个线程在get或set,所以不存在数据没修改完就有线程来取[/quote] 额。。。这个倒是,如果set的同时,又get了,又没有wait,那么线程会不会发生阻塞呢?该如何解决? [/quote] get的时候isOnChanged不可能为true,那个wait的方法不会被执行到的,单纯要保证getset的安全,不用这个复杂,直接在方法上加synchronized就好了,其他的代码都可以去掉[/quote] 受教了。。。仿佛明白了什么。但是如果遇到阻塞的时候会怎样,[/quote] 遇到阻塞时不怎么样,效率和安全是一对矛盾体,你要保证效率就要并行,要并行就必然有安全问题;你要安全就要串行,所有逻辑全部串行就绝对安全但是牺牲效率。 所以在某些场景下,牺牲效率是没有办法的。不过好在对于一般的系统而言,性能瓶颈都不会出现在这种阻塞/不阻塞的权衡上,建议你也不要在这种问题上纠结,没有意义
大板牙花生 2014-06-03
  • 打赏
  • 举报
回复
引用 6 楼 ygycomon 的回复:
[quote=引用 4 楼 wter26 的回复:] [quote=引用 3 楼 ygycomon 的回复:] [quote=引用 2 楼 wter26 的回复:] [quote=引用 1 楼 ygycomon 的回复:] 至少在这段代码里是多余的,因为isOnChanged 在get方法里永远不会是true
我是这样想的,在多线程当中使用单例模式,如果别的线程中的get与set产生了竞争条件,有没有可能正好是取数据的时候为正在修改的时候,或者高手给指点下,代码该如何修改。[/quote] get和set都在spoutNowSum 上加了锁,这里是同步操作,消除了竞争条件,一次性只有一个线程在get或set,所以不存在数据没修改完就有线程来取[/quote] 额。。。这个倒是,如果set的同时,又get了,又没有wait,那么线程会不会发生阻塞呢?该如何解决? [/quote] get的时候isOnChanged不可能为true,那个wait的方法不会被执行到的,单纯要保证getset的安全,不用这个复杂,直接在方法上加synchronized就好了,其他的代码都可以去掉[/quote] 受教了。。。仿佛明白了什么。但是如果遇到阻塞的时候会怎样,
大板牙花生 2014-06-03
  • 打赏
  • 举报
回复
引用 5 楼 okafor2011 的回复:
spoutNowSum  这个用atom类型就可以... 不用 synchronized
引用 5 楼 okafor2011 的回复:
spoutNowSum  这个用atom类型就可以... 不用 synchronized
您说的倒是。主要我也是想考虑把这个换成别的对象。因为这只是一个样例代码。对多线程不熟悉。 我提到的考虑多线程下的单例模式如何降低阻塞,您有什么高招给讲讲么?
致知Fighting 2014-06-03
  • 打赏
  • 举报
回复
引用 4 楼 wter26 的回复:
[quote=引用 3 楼 ygycomon 的回复:] [quote=引用 2 楼 wter26 的回复:] [quote=引用 1 楼 ygycomon 的回复:] 至少在这段代码里是多余的,因为isOnChanged 在get方法里永远不会是true
我是这样想的,在多线程当中使用单例模式,如果别的线程中的get与set产生了竞争条件,有没有可能正好是取数据的时候为正在修改的时候,或者高手给指点下,代码该如何修改。[/quote] get和set都在spoutNowSum 上加了锁,这里是同步操作,消除了竞争条件,一次性只有一个线程在get或set,所以不存在数据没修改完就有线程来取[/quote] 额。。。这个倒是,如果set的同时,又get了,又没有wait,那么线程会不会发生阻塞呢?该如何解决? [/quote] get的时候isOnChanged不可能为true,那个wait的方法不会被执行到的,单纯要保证getset的安全,不用这个复杂,直接在方法上加synchronized就好了,其他的代码都可以去掉
okafor2011 2014-06-03
  • 打赏
  • 举报
回复
spoutNowSum  这个用atom类型就可以... 不用 synchronized
大板牙花生 2014-06-03
  • 打赏
  • 举报
回复
引用 3 楼 ygycomon 的回复:
[quote=引用 2 楼 wter26 的回复:] [quote=引用 1 楼 ygycomon 的回复:] 至少在这段代码里是多余的,因为isOnChanged 在get方法里永远不会是true
我是这样想的,在多线程当中使用单例模式,如果别的线程中的get与set产生了竞争条件,有没有可能正好是取数据的时候为正在修改的时候,或者高手给指点下,代码该如何修改。[/quote] get和set都在spoutNowSum 上加了锁,这里是同步操作,消除了竞争条件,一次性只有一个线程在get或set,所以不存在数据没修改完就有线程来取[/quote] 额。。。这个倒是,如果set的同时,又get了,又没有wait,那么线程会不会发生阻塞呢?该如何解决?
致知Fighting 2014-06-03
  • 打赏
  • 举报
回复
引用 2 楼 wter26 的回复:
[quote=引用 1 楼 ygycomon 的回复:] 至少在这段代码里是多余的,因为isOnChanged 在get方法里永远不会是true
我是这样想的,在多线程当中使用单例模式,如果别的线程中的get与set产生了竞争条件,有没有可能正好是取数据的时候为正在修改的时候,或者高手给指点下,代码该如何修改。[/quote] get和set都在spoutNowSum 上加了锁,这里是同步操作,消除了竞争条件,一次性只有一个线程在get或set,所以不存在数据没修改完就有线程来取
大板牙花生 2014-06-03
  • 打赏
  • 举报
回复
引用 1 楼 ygycomon 的回复:
至少在这段代码里是多余的,因为isOnChanged 在get方法里永远不会是true
我是这样想的,在多线程当中使用单例模式,如果别的线程中的get与set产生了竞争条件,有没有可能正好是取数据的时候为正在修改的时候,或者高手给指点下,代码该如何修改。
致知Fighting 2014-06-03
  • 打赏
  • 举报
回复
至少在这段代码里是多余的,因为isOnChanged 在get方法里永远不会是true

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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