`
gaoyuntao2005
  • 浏览: 303049 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java并发学习之三:非阻塞漫想,关于环岛与地铁

阅读更多

到过北京上地的都会知道,上地城铁往西走有一个很大的上地环岛,旁边是中关村发展大厦,第一次到北京的时候还给了小弟一番挺大的感触 

经常从环岛这里经过,总会思考一个问题:北京地价这么贵,为什么在这里要建一个这么大的环岛呢?环岛到底有什么作用呢?解决交通拥塞?为行人方便?还是别的原因? 

在百度百科可以搜到:是为了减少交通(和谐)事故的发生。 

还有别的好处吗? 

先看看普通的十字路口,要么横向通车,要么纵向通车,可以这样去理解,在两个道路交叉这块正方形是两个线程抢占的共享变量 

A在运行时,需要锁住变量,然后走,B等待,B运行时也一样 

在并发里面有一种方法:非阻塞算法 
没了解过并发的同学可能不清楚非阻塞算法 
这里写一个简单的例子 

Java代码  收藏代码
  1. AtomicInteger count = new AtomicInteger(0);  
  2. ……  
  3. for(;;)  
  4. {  
  5.     int expect = count.get();  
  6.     if(!count.compareAndSet(expect,expect+1))  
  7.     {  
  8.         continue;  
  9.     }  
  10.     else  
  11.     {  
  12.         return;  
  13.     }  
  14. }  

这样就实现了一个原子性的i++动作 
为什么要这样实现呢?为什么不用锁? 
简而言之,是因为线程状态切换是要消耗很多资源的,如A锁住了,B正好也访问,就需要等待了,然后就有一个线程状态的切换,A释放了,B就可以获得锁了,然后又一个线程状态的切换,很明显,为了如此简单的一个功能去牺牲性能是很亏的 

这个跟环岛又有什么关系呢? 
我们先看看十字路口的通常设计有没有“线程切换”的消耗 
黄灯亮:红灯亮,横向停止通车,纵向现在还是停止的 
红灯亮:绿灯亮,横向保持停止,纵向开始通车,汽车加速,然后以平缓通过 
红灯亮:黄灯亮…… 
可以看到,黄灯时间消耗(最后一辆汽车起步到通过路口的时间),汽车加速消耗 

很明显,上述的两个消耗环岛都是没有的 

这是我理解的环岛优于普通十字路口的一个优势 
(当然,这个推论和判断都是很片面的,但从并发这个角度来看,还是有一定的道理的) 


地铁的漫想 
现在都在追求速度,动车组,飞机…… 
为了响应以后的高速高效的社会,地铁能不能提速呢? 

地铁的很大一部分时间消耗其实不在路上,而是在进站,旅客上车,出站这个时间上,但很明显,地铁必须要让人下车的,感觉这是一个无法解决的问题 

在并发的角度来看,旅客下车这一过程可以看待为一个无法避免的关键路径 
能不能用多线程来解决这个问题呢? 
答案应该是可以的 
首先,需要另一个线程专门负责这个关键路径 
A列车以恒速通行在整个路径 
B列车负责C站的下车业务 
在从D站通往C站的过程中,AB车完成旅客的交换业务(都以恒速运行) 
到了C站,A车呼啸而过 
B列车在C站停车,旅客下车,然后重新绕到D站准备下一个下车业务 

这样,在不加速的情况下,列车的行驶速度起码提高了1.5倍(每站约3分钟,每次停车约1分钟) 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics