Java同步对象?
发布时间:2020-12-15 08:46:17 所属栏目:Java 来源:网络整理
导读:我在 java中有一个类,它读取UDP数据包并将它们放在一个对象中(基本上是无限循环).然后在多个单独的线程中访问此对象,但显然,由于它是同时填充的,因此所有这些getter / setter都采用同步方法.问题是,现在这些getter有这样的代码: public synchronized SomeOb
我在
java中有一个类,它读取UDP数据包并将它们放在一个对象中(基本上是无限循环).然后在多个单独的线程中访问此对象,但显然,由于它是同时填充的,因此所有这些getter / setter都采用同步方法.问题是,现在这些getter有这样的代码:
public synchronized SomeObject exampleGetter() { if(this.isReceiving) return oldCachedObject; else return currentObject; } 显然,这不是最好的处理方式,所以我应该如何编写方法(许多不同的方法),将对象完全锁定到一个线程并阻塞其他线程(包括创建对象的线程)第一名)?我看了一下synchronized块,但是我对于“锁定对象”有什么影响感到困惑,是那个在给定时间可以访问块的对象?任何意见,将不胜感激.谢谢! 解决方法
synchronized关键字在整个对象实例上同步,而不仅仅是setter.我宁愿选择细粒度锁定策略或更好…使用线程安全数据结构来存储和获取接收到的数据.我个人喜欢BlockingQueue< T>其中T是您在网络上收到的数据类型.
假设您正在通过套接字接收对象: public class ReceivedDataHolder{ BlockingQueue<Object> dataBuffer = new LinkedBlockingQueue<Object>(); //... public void dataReceived(Object data){ dataBuffer.offer(data); } public Object getReceivedData(){ return dataBuffer.take(); } } 在您的套接字中,您可以在收到数据时执行此操作: receivedDataHolder.dataReceived(object); 任何想要获取数据的线程应该: receivedDataHolder.getReceivedData(); 后一种方法调用将阻塞调用线程,直到队列中有一个元素可用(请查看this以获取更多详细信息) 我希望这有帮助 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |