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

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

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

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

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

还有别的好处吗?

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

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分钟)
分享到:
评论
1 楼 zq3062211015 2014-03-27  
想法很好。。万一 c就一个人下车 b很浪费啊

相关推荐

Global site tag (gtag.js) - Google Analytics