synchronized关键字在整个对象实例上同步,而不仅仅是setter.我宁愿选择细粒度锁定策略或更好…使用线程安全数据结构来存储和获取接收到的数据.我个人喜欢BlockingQueue< T>其中T是您在网络上收到的数据类型.
假设您正在通过套接字接收对象:
public class ReceivedDataHolder{
BlockingQueue dataBuffer = new LinkedBlockingQueue();
//...
public void dataReceived(Object data){
dataBuffer.offer(data);
}
public Object getReceivedData(){
return dataBuffer.take();
}
}
在您的套接字中,您可以在收到数据时执行此操作:
receivedDataHolder.dataReceived(object);
任何想要获取数据的线程应该:
receivedDataHolder.getReceivedData();
后一种方法调用将阻塞调用线程,直到队列中有一个元素可用(请查看this以获取更多详细信息)
我希望这有帮助