加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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以获取更多详细信息)

我希望这有帮助

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读