Java同步对象?

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块,但是我对于"锁定对象"有什么影响感到困惑,是那个在给定时间可以访问块的对象?任何意见,将不胜感激.谢谢!

GET*_*Tah 5

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)

后一个方法调用将阻塞调用线程,直到队列中有一个元素可用(请查看更多详细信息)

我希望这有帮助

  • `BlockingQueue`是一个接口,所以`new BlockingQueue <Object>();`将不会编译.您必须使用实现接口的具体类,例如`ArrayBlockingQueue <T>`或`LinkedBlockingQueue <T>`,它们是生产者/消费者最常用的具体阻塞队列. (2认同)