到過北京上地的都會知道,上地城鐵往西走有一個很大的上地環島,旁邊是中關村發展大廈,第一次到北京的時候還給了小弟一番挺大的感觸
經常從環島這里經過,總會思考一個問題:北京地價這么貴,為什么在這里要建一個這么大的環島呢?環島到底有什么作用呢?解決交通擁塞?為行人方便?還是別的原因?
在百度百科可以搜到:是為了減少交通(和諧)事故的發生。
還有別的好處嗎?
先看看普通的十字路口,要么橫向通車,要么縱向通車,可以這樣去理解,在兩個道路交叉這塊正方形是兩個線程搶占的共享變量
A在運行時,需要鎖住變量,然后走,B等待,B運行時也一樣
在并發里面有一種方法:非阻塞算法
沒了解過并發的同學可能不清楚非阻塞算法
這里寫一個簡單的例子
這樣就實現了一個原子性的i++動作
為什么要這樣實現呢?為什么不用鎖?
簡而言之,是因為線程狀態切換是要消耗很多資源的,如A鎖住了,B正好也訪問,就需要等待了,然后就有一個線程狀態的切換,A釋放了,B就可以獲得鎖了,然后又一個線程狀態的切換,很明顯,為了如此簡單的一個功能去犧牲性能是很虧的
這個跟環島又有什么關系呢?
我們先看看十字路口的通常設計有沒有“線程切換”的消耗
黃燈亮:紅燈亮,橫向停止通車,縱向現在還是停止的
紅燈亮:綠燈亮,橫向保持停止,縱向開始通車,汽車加速,然后以平緩通過
紅燈亮:黃燈亮……
可以看到,黃燈時間消耗(最后一輛汽車起步到通過路口的時間),汽車加速消耗
很明顯,上述的兩個消耗環島都是沒有的
這是我理解的環島優于普通十字路口的一個優勢
(當然,這個推論和判斷都是很片面的,但從并發這個角度來看,還是有一定的道理的)
地鐵的漫想
現在都在追求速度,動車組,飛機……
為了響應以后的高速高效的社會,地鐵能不能提速呢?
地鐵的很大一部分時間消耗其實不在路上,而是在進站,旅客上車,出站這個時間上,但很明顯,地鐵必須要讓人下車的,感覺這是一個無法解決的問題
在并發的角度來看,旅客下車這一過程可以看待為一個無法避免的關鍵路徑
能不能用多線程來解決這個問題呢?
答案應該是可以的
首先,需要另一個線程專門負責這個關鍵路徑
A列車以恒速通行在整個路徑
B列車負責C站的下車業務
在從D站通往C站的過程中,AB車完成旅客的交換業務(都以恒速運行)
到了C站,A車呼嘯而過
B列車在C站停車,旅客下車,然后重新繞到D站準備下一個下車業務
這樣,在不加速的情況下,列車的行駛速度起碼提高了1.5倍(每站約3分鐘,每次停車約1分鐘)
已有 0 人發表留言,猛擊->>這里<<-參與討論
ItEye推薦
經常從環島這里經過,總會思考一個問題:北京地價這么貴,為什么在這里要建一個這么大的環島呢?環島到底有什么作用呢?解決交通擁塞?為行人方便?還是別的原因?
在百度百科可以搜到:是為了減少交通(和諧)事故的發生。
還有別的好處嗎?
先看看普通的十字路口,要么橫向通車,要么縱向通車,可以這樣去理解,在兩個道路交叉這塊正方形是兩個線程搶占的共享變量
A在運行時,需要鎖住變量,然后走,B等待,B運行時也一樣
在并發里面有一種方法:非阻塞算法
沒了解過并發的同學可能不清楚非阻塞算法
這里寫一個簡單的例子
AtomicInteger count = new AtomicInteger(0); …… for(;;) { int expect = count.get(); if(!count.compareAndSet(expect,expect+1)) { continue; } else { return; } }
這樣就實現了一個原子性的i++動作
為什么要這樣實現呢?為什么不用鎖?
簡而言之,是因為線程狀態切換是要消耗很多資源的,如A鎖住了,B正好也訪問,就需要等待了,然后就有一個線程狀態的切換,A釋放了,B就可以獲得鎖了,然后又一個線程狀態的切換,很明顯,為了如此簡單的一個功能去犧牲性能是很虧的
這個跟環島又有什么關系呢?
我們先看看十字路口的通常設計有沒有“線程切換”的消耗
黃燈亮:紅燈亮,橫向停止通車,縱向現在還是停止的
紅燈亮:綠燈亮,橫向保持停止,縱向開始通車,汽車加速,然后以平緩通過
紅燈亮:黃燈亮……
可以看到,黃燈時間消耗(最后一輛汽車起步到通過路口的時間),汽車加速消耗
很明顯,上述的兩個消耗環島都是沒有的
這是我理解的環島優于普通十字路口的一個優勢
(當然,這個推論和判斷都是很片面的,但從并發這個角度來看,還是有一定的道理的)
地鐵的漫想
現在都在追求速度,動車組,飛機……
為了響應以后的高速高效的社會,地鐵能不能提速呢?
地鐵的很大一部分時間消耗其實不在路上,而是在進站,旅客上車,出站這個時間上,但很明顯,地鐵必須要讓人下車的,感覺這是一個無法解決的問題
在并發的角度來看,旅客下車這一過程可以看待為一個無法避免的關鍵路徑
能不能用多線程來解決這個問題呢?
答案應該是可以的
首先,需要另一個線程專門負責這個關鍵路徑
A列車以恒速通行在整個路徑
B列車負責C站的下車業務
在從D站通往C站的過程中,AB車完成旅客的交換業務(都以恒速運行)
到了C站,A車呼嘯而過
B列車在C站停車,旅客下車,然后重新繞到D站準備下一個下車業務
這樣,在不加速的情況下,列車的行駛速度起碼提高了1.5倍(每站約3分鐘,每次停車約1分鐘)
已有 0 人發表留言,猛擊->>這里<<-參與討論
ItEye推薦