到过北京上地的都会知道,上地城铁往西走有一个很大的上地环岛,旁边是中关村发展大厦,第一次到北京的时候还给了小弟一番挺大的感触
经常从环岛这里经过,总会思考一个问题:北京地价这么贵,为什么在这里要建一个这么大的环岛呢?环岛到底有什么作用呢?解决交通拥塞?为行人方便?还是别的原因?
在百度百科可以搜到:是为了减少交通(和谐)事故的发生。
还有别的好处吗?
先看看普通的十字路口,要么横向通车,要么纵向通车,可以这样去理解,在两个道路交叉这块正方形是两个线程抢占的共享变量
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分钟)
分享到:
相关推荐
java并发学习总结 例子:包含(并发容器、同步容器、同步工具、死锁、异常、中断、线程池、返回结果、同步方法等代码例子)
13-Java并发编程学习宝典.zip
本文的主题是关于具有java语言风格的Thread、synchronized、volatile,以及J2SE5中新增的概念,如锁(Lock)、原子性(Atomics)、并发集合类、线程协作摘要、Executors。开发者通过这些基础的接口可以构建高并发、线程...
本文介绍了在Java理论与实践中,几种比较简单的非阻塞算法的工作方式。在不只一个线程访问一个互斥的变量时,所有线程都必须使用同步,否则就可能会发生一些非常糟糕的事情。Java语言中主要的同步手段就是...
Java并发编程:设计原则与模式(第二版).pdf
Java并发编程:设计原则与模式(第二版)
java并发编程pdf文档第二部分:Java并发编程实战.pdf、Java多线程编程核心技术.pdf、实战Java高并发程序设计.pdf
B站楠哥JUC Java并发编程
java并发编程与实践是java高并发的分析文档,分析并介绍了高并发的解决方案。
Java并发编程:设计原则与模式Java并发编程:设计原则与模式
第1章 简介 1.1 并发简史 1.2 线程的优势 1.2.1 发挥多处理器的强大能力 1.2.2 建模的简单性 1.2.3 异步事件的简化处理 ...第15章 原子变量与非阻塞同步机制 第16章 Java内存模型 附录A 并发性标注 参考文献
JAVA并发编程艺术 高清pdf : 1.并发变成的挑战 2. java并发机制的底层实现原理 3. java 内存模型 4. java并发编程基础 5.java中的锁。。。。。。。
java并发编程:设计原则与模式.rar
【大纲】 服务端软件=排队服务 回顾常见的并发模型 介绍SEDA 分享我们的经验
Java 并发学习笔记: 进程和线程, 并发理论, 并发关键字, Lock 体系, 原子操作类, 发容器 & 并发工具, 线程池, 并发实践 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的...
Java并发编程:volatile关键字解析
java并发编程实战源码 附有本书所有源码,maven 导入 eclipse或idea
Java并发编程学习笔记.
java并发编程艺术java并发编程艺术java并发编程艺术java并发编程艺术java并发编程艺术
第49节Java中的阻塞队列原理与使用00:26:18分钟 | 第50节实战:简单实现消息队列00:11:07分钟 | 第51节并发容器ConcurrentHashMap原理与使用00:38:22分钟 | 第52节线程池的原理与使用00:42:49分钟 | 第53节...