首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

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

2012-11-03 
java并发学习之三:非阻塞漫想,关于环岛与地铁到过北京上地的都会知道,上地城铁往西走有一个很大的上地环岛

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

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

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

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

还有别的好处吗??

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

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

在并发里面有一种方法:非阻塞算法?
没了解过并发的同学可能不清楚非阻塞算法?
这里写一个简单的例子?
Java代码??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分钟)?

热点排行