gpt4 book ai didi

Java同步对象?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:32:28 25 4
gpt4 key购买 nike

我在 java 中有一个类,它读取 UDP 数据包并将它们放入一个对象中(基本上是无限循环)。然后在多个单独的线程中访问该对象,但显然,由于它是同时填充的,因此所有这些 getters/setters 都在同步方法中。问题是,现在这些 getter 有这样的代码:

public synchronized SomeObject exampleGetter() {
if(this.isReceiving)
return oldCachedObject;
else
return currentObject;
}

显然,这不是最好的做事方式,所以我应该如何编写方法(很多不同的方法)一次将对象完全锁定到一个线程并阻塞其他线程(包括创建的线程)首先是对象)?我查看了同步块(synchronized block),但我对“锁定对象”有什么影响感到有点困惑,是那个在给定时间可以访问该 block 的对象吗?任何意见,将不胜感激。谢谢!

最佳答案

synchronized关键字在整个对象实例上同步,而不仅仅是 setter。我宁愿采用细粒度的锁定策略或更好...使用线程安全的数据结构来存储和获取接收到的数据。我个人喜欢 BlockingQueue<T>其中 T是您在网络上接收的数据类型。

假设您收到 Object s 在套接字上:

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 了解更多详细信息)

希望对你有帮助

关于Java同步对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8595994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com