当前位置:  技术问答>java相关

sychronized与非synchronized的协调

    来源: 互联网  发布时间:2015-06-11

    本文导语:  我有一个奇怪的问题想问各位大侠,若有一个方法A,在其中对某个对象o使用synchronized关键字保护起来,而有另一个方法B,它也需要使用对象o,而它对对象o的使用不需要限制,也就是说在B内对o的使用并没有用synchron...

我有一个奇怪的问题想问各位大侠,若有一个方法A,在其中对某个对象o使用synchronized关键字保护起来,而有另一个方法B,它也需要使用对象o,而它对对象o的使用不需要限制,也就是说在B内对o的使用并没有用synchronized关键字保护。在实际运行中,当一个线程甲调用了方法A,并获得了对象o的锁,这个时候,另一个线程乙调用了方法B,若这种情况发生线程乙是否需要等到线程甲放弃对象o的锁才能对o进行操作?
我现在有个项目碰到了这样的情况,对象o是一个支持全双工通信的连接,方法A的作用是一个发送消息包,而方法B的作用是在连接上侦听消息。对于所有的发送消息线程,当他们需要使用o来发消息的时候,必须将o同步起来,而对于接收消息的线程,即使在o被发送线程占用的时候,它也应该可以在o上进行侦听,相反,在它使用o侦听的同时,发送线程也可以获得o的锁进行消息的发送。对于o的限制仅仅发生在各个发送线程之间。所以我写的代码就是发送消息的方法使用o的使用用synchronized保护,而接收线程使用o的时候则不用synchronized保护,这样写会满足我的需要吗?会引起不可预测的结果吗?
请大侠们指教,谢谢!

|
回叶子
对象锁只是一个特别的标记,是独立的,对对象本身不产生任何影响,
在一个线程中锁定后,在其它线程还可以照样使用,调它的方法,调它的属性都可以,
除了原先的线程之外,其它线程以它为锁进入同步是不行的.

|
如果方法 B 没有 synchronized的话,不需要得到对象 o 的锁就可以执行。

|
对于所有的发送消息线程,当他们需要使用o来发消息的时候,必须将o同步起来,而对于接收消息的线程,即使在o被发送线程占用的时候,它也应该可以在o上进行侦听,相反,在它使用o侦听的同时,发送线程也可以获得o的锁进行消息的发送

so your sender is writer, listener is reader.
this is a typical situation where writers conflict, readers dont. and you don't want reader conflict with writer.
i.e.
W xxxxxx W
R ------ R
W ------ R

the key is that whether your writer can generate inconsistent state. If it does not, then you don't need to put lock on reader. otherwise, better synchronize reader as well.
By consistent state, I mean, if we interrupt your writer function at any point, the object is still good to use.

Normally, immutable structure can work suprisingly well with this requirement.


    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3