Sup*_*ron 3 java concurrency multithreading synchronization thread-safety
我在java中有一个类,它读取UDP数据包并将它们放在一个对象中(基本上是无限循环).然后,可以在多个单独的线程中访问此对象,但显然,由于它是在同一时间填充的,因此所有这些getter/setter都采用同步方法.问题是,现在这些getter有这样的代码:
public synchronized SomeObject exampleGetter() {
if(this.isReceiving)
return oldCachedObject;
else
return currentObject;
}
Run Code Online (Sandbox Code Playgroud)
显然,这不是最好的处理方式,所以我应该如何编写方法(许多不同的方法),将对象完全锁定到一个线程并阻塞其他线程(包括创建对象的线程)第一名)?我看了一下synchronized块,但是我对于"锁定对象"有什么影响感到困惑,是那个在给定时间可以访问块的对象?任何意见,将不胜感激.谢谢!
该synchronized关键字同步对整个对象实例不只是二传手.我宁愿选择细粒度锁定策略或更好...使用线程安全数据结构来存储和获取接收到的数据.我个人喜欢的 BlockingQueue<T>地方T是你收到网络上的数据的类型.
所以假设你正在接收Object套接字:
public class ReceivedDataHolder{
BlockingQueue<Object> dataBuffer = new LinkedBlockingQueue<Object>();
//...
public void dataReceived(Object data){
dataBuffer.offer(data);
}
public Object getReceivedData(){
return dataBuffer.take();
}
}
Run Code Online (Sandbox Code Playgroud)
在您的套接字中,您可以在收到数据时执行此操作:
receivedDataHolder.dataReceived(object);
Run Code Online (Sandbox Code Playgroud)
任何想要获取数据的线程应该:
receivedDataHolder.getReceivedData();
Run Code Online (Sandbox Code Playgroud)
后一个方法调用将阻塞调用线程,直到队列中有一个元素可用(请查看此更多详细信息)
我希望这有帮助