Future 与 FutureTask

Future

来自 Java DOC 文档:Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此方法。取消则由 cancel 方法来执行。还提供了其他方法,以确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用 Future 但又不提供可用的结果,则可以声明 Future<?> 形式类型、并返回 null 作为底层任务的结果。

也就是说Future具有这样的特性:

  • 异步执行,可用 get 方法获取执行结果。
  • 如果计算还没完成,get 方法是会阻塞的,如果完成了,是可以多次获取并立即得到结果的。
  • 如果计算还没完成,是可以取消计算的。
  • 可以查询计算的执行状态。

埋两个小问题用于设想下怎么实现Future:

  1. Future在计算完成前阻塞 get 访问,完成后可以自由访问,如何实现 get 方法?
  2. 计算的取消是怎么实现的?被取消的计算会终止执行吗?

继续阅读

TCP/IP 协议详解 第3章 IP:网际协议

IP是TCP/IP协议族中最为核心的协议。所有的TCP、UDP、ICMP以及IGMP数据都以IP数据报格式传输。IP提供了不可靠、无连接的数据报传送服务。

不可靠(unreliable)的意思是它不能保证IP数据报能成功地到达目的地。IP仅提供最好的传输服务。任何可靠性要求必须由上层来提供。

无连接(connectionless)是指IP并不维护任何关于后续数据报的状态信息。每个数据报的处理是相互独立的,这也就是说IP数据报可以不按发送顺序接收。

继续阅读

CopyOnWrite 策略

CopyOnWrite 是用于解决并发读写的一种策略,在Write的时候对共享变量进行Copy,在副本上进行更新,再把更新好的副本原子性地替换原来的共享变量。

实现:

  • 读操作Read不涉及对共享变量的更改,因此不需要同步。
  • 如果有多个线程同时申请Write,在各自拷贝的副本上进行修改,然后更新回共享变量,就会导致某些线程的修改被其他线程覆盖。因此Write必须在同步的情况下进行。

优缺点:

  • 由于修改是在副本上进行,所以修改的同时允许其他线程进行读。
  • 由于需要进行拷贝,当然会存在内存占用的问题。
  • 由于在进行写的过程中仍然允许读,所以数据不是实时一致的,只有在写完成后才一致,也就是最终一致。如果需要实时的一致性,建议使用读写锁。

CopyOnWrite 策略适用于那些读远多于写、且对实时性要求不高的操作,优势在读不需要同步。

更多了解可参考 JUC 里 CopyOnWriteArrayList 的实现。


欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。

TCP/IP 协议详解 第2章 链路层

在TCP/IP协议族中,链路层主要有三个目的:

  1. 为IP模块发送和接收IP数据报;
  2. 为ARP模块发送ARP请求和接收ARP应答;
  3. 为RARP发送RARP请求和接收RARP应答。

以太网和IEEE 802封装

以太网这个术语一般是指DEC、Intel、Xeror公司在1982年联合发布的一个标准,它是当今TCP/IP采用的主要的局域网技术,以太网IP数据报的封装在RFC894中定义,地址是48bit。

IEEE 802 是IEEE(电子电气工程师协会)802委员会公布的一个稍有不同的标准集,其中802.3针对整个CSMA/CD网络,802.4针对令牌总线网络,802.5针对令牌环网络。

最常用的封装格式是RFC894。

IEEE 802.2/802.3(RFC-1042)和以太网封装格式(RFC-894) (方框下的数字表示占用的字节数):
ieee802和以太网帧封装格式

继续阅读