java并发学习之三:非拥塞漫想,关于环岛与地铁
java并发学习之三:非阻塞漫想,关于环岛与地铁到过北京上地的都会知道,上地城铁往西走有一个很大的上地环岛
java并发学习之三:非阻塞漫想,关于环岛与地铁
到过北京上地的都会知道,上地城铁往西走有一个很大的上地环岛,旁边是中关村发展大厦,第一次到北京的时候还给了小弟一番挺大的感触?
经常从环岛这里经过,总会思考一个问题:北京地价这么贵,为什么在这里要建一个这么大的环岛呢?环岛到底有什么作用呢?解决交通拥塞?为行人方便?还是别的原因??
在百度百科可以搜到:是为了减少交通(和谐)事故的发生。?
还有别的好处吗??
先看看普通的十字路口,要么横向通车,要么纵向通车,可以这样去理解,在两个道路交叉这块正方形是两个线程抢占的共享变量?
A在运行时,需要锁住变量,然后走,B等待,B运行时也一样?
在并发里面有一种方法:非阻塞算法?
没了解过并发的同学可能不清楚非阻塞算法?
这里写一个简单的例子?
Java代码??
- 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分钟)?