java wait(long timeout, int nanos),後面的nanos有什麼用?

【源碼】

java1.8:

 1 public final void wait(long timeout, int nanos) throws InterruptedException {
 2     if (timeout < 0) {
 3         throw new IllegalArgumentException("timeout value is negative");
 4     }
 5 
 6     if (nanos < 0 || nanos > 999999) {
 7         throw new IllegalArgumentException(
 8                             "nanosecond timeout value out of range");
 9     }
10 
11     if (nanos > 0) {
12         timeout++;
13     }
14 
15     wait(timeout);
16 }

更早期一些的版本:

 1 public final void wait(long timeout, int nanos) throws nterruptedException {
 2     if (timeout < 0) {
 3         throw new IllegalArgumentException("timeout value is negative");
 4     }
 5     // nanos 單位爲納秒,  1毫秒 = 1000 微秒 = 1000 000 納秒
 6     if (nanos < 0 || nanos > 999999) {
 7         throw new IllegalArgumentException(
 8                 "nanosecond timeout value out of range");
 9     }
10 
11     // nanos 大於 500000 即半毫秒  就timout 加1毫秒
12     // 特殊情況下: 如果timeout爲0且nanos大於0,則timout加1毫秒
13     if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
14         timeout++;
15     }
16 
17     wait(timeout);
18 }

 

【官方解釋】

參數timeout的單位爲毫秒, 參數nanos 的單位爲納秒, 1毫秒 = 1000 微秒 = 1000 000 納秒。

處理時,由於納秒級時間太短, 所以對參數nanos 其採取了近似處理,

  • 原先的時候大於半毫秒的加1毫秒,小於1毫秒則捨棄(特殊情況下,參數timeout0,參數nanos大於0,也算爲1毫秒);
  • 現在則是直接加1毫秒。

  其主要作用應該在能更精確控制等待時間(尤其在高併發時,毫秒的時間節省也是很值得的)

   

【思考】

僅僅是加了1ms,其實是毫無意義的。

猜測應該是原先的時候,需要在高併發的情況下,嚴格控制等待時間,但是當時限於技術優先,將其放進了TODO中,通過簡單的方法先暫時留存在jdk中。

但是到了jdk後期版本,發現這個nanos其實毫無意義,但是爲了兼容之前的版本,直接粗暴加1

   

唉,其實沒有必要在設計的時候爲以後增加太多的預期,否則可能會存在很多推翻前人思路的行爲,後人再看源碼就會很困擾。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章