`
gaoyuntao2005
  • 浏览: 312481 次
  • 性别: 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分钟) 

分享到:
评论

相关推荐

    13-Java并发编程学习宝典.zip

    "13-Java并发编程学习宝典.zip" 包含了一系列关于Java并发编程的学习资源,旨在帮助开发者掌握多线程编程的核心技术和最佳实践。以下是这些资源所涵盖的关键知识点: 1. **多线程基础** - "03 多线程开发如此简单—...

    Java并发编程:设计原则与模式(第二版)-3

    2. **并发控制**:Java提供了多种并发控制机制,如synchronized关键字、volatile变量、java.util.concurrent包下的锁和同步工具类(如ReentrantLock、Semaphore、CountDownLatch、CyclicBarrier)。这些机制用于解决...

    java并发编程与实践

    通过深入学习"Java并发编程与实践"文档,开发者能够提升自己在高并发环境下的编程能力,设计出更加健壮和高效的Java应用程序。这份资料对于理解Java并发原理、优化并发代码和解决并发问题具有极大的价值。

    JAVA并发编程艺术pdf版

    - **Executor框架**:Java提供的线程池实现,通过ThreadPoolExecutor配置线程池参数,优化系统资源利用。 - **Executors工厂方法**:如newFixedThreadPool、newSingleThreadExecutor、newWorkStealingPool等,用于...

    Java 并发编程实战.pdf

    - **Java并发机制**:Java提供了丰富的并发机制来支持多线程程序的编写,包括但不限于`Thread`类、`Runnable`接口、`Callable`接口以及`Executor`框架等。 - **锁机制**:Java中的锁机制主要包括synchronized关键字...

    java 并发编程的艺术pdf清晰完整版 源码

    6. **原子变量与并发工具类**:Java的并发包(java.util.concurrent.atomic)提供了原子变量,如AtomicInteger,它们能保证在并发环境下的原子性操作。此外,书中还会涵盖其他并发工具类,如Semaphore、...

    java并发编程:设计原则与模式.rar

    《Java并发编程:设计原则与模式》是一本深入探讨Java多线程编程的书籍,它涵盖了并发编程中的关键概念、原则和模式。在Java中,并发处理是优化应用程序性能、提高资源利用率的重要手段,尤其在现代多核处理器的环境...

    Java并发编程:设计原则与模式(第二版)

    Java并发编程:设计原则与模式(第二版).pdf

    java高并发编程第一版

    8. **原子操作与CAS**:Atomic类和Compare-and-Swap(CAS)算法是无锁编程的基础,通过非阻塞的方式实现线程间的协调,可以提高并发程序的效率。 9. **Java并发库的最新发展**:如果书籍更新至较新版本,可能会包含...

    java并发编程2

    Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。以下是对标题和描述中所提及的几个知识点的详细解释: 1. **线程与并发** - **线程*...

    Java并发编程的设计原则与模式

    4. **非阻塞并发**:使用非阻塞算法,如CAS(Compare and Swap),可以在无锁的情况下实现并发,提高系统性能。 5. **避免长时间持有锁**:减少线程持有锁的时间,降低发生竞争的概率。 三、并发编程模式 1. **生产...

    java并发编程书籍

    5. **并发容器**:Java并发包(`java.util.concurrent`)提供了一系列优化的并发容器,如`ConcurrentHashMap`、`CopyOnWriteArrayList`、`BlockingQueue`等,它们在内部实现了线程安全的机制,提高了并发性能。...

    JAVA并发编程艺术 高清pdf

    JAVA并发编程艺术 高清pdf : 1.并发变成的挑战 2. java并发机制的底层实现原理 3. java 内存模型 4. java并发编程基础 5.java中的锁。。。。。。。

    Java并发编程学习笔记

    Java并发包(java.util.concurrent)也提供了丰富的并发工具,如线程安全集合(如ConcurrentHashMap)、阻塞队列(如ArrayBlockingQueue)、信号量(Semaphore)、并发集合(如CopyOnWriteArrayList)和各种执行器...

    一本经典的多线程书籍 Java并发编程 设计原则与模式 第二版 (英文原版)

    《Java并发编程 设计原则与模式 第二版》是一本深受程序员喜爱的经典书籍,由Addison Wesley出版。这本书深入探讨了Java平台上的多线程编程技术,为开发者提供了丰富的设计原则和模式,帮助他们理解和解决并发环境中...

    《java 并发编程实战高清PDF版》

    《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南。这本书旨在帮助开发者理解和掌握在Java环境中创建高效、可扩展且可靠的多线程应用程序的关键技术和实践。它涵盖了从基本概念到高级主题的广泛内容,...

    (PDF带目录)《Java 并发编程实战》,java并发实战,并发

    《Java 并发编程实战》是一本专注于Java并发编程的权威指南,对于任何希望深入了解Java多线程和并发控制机制的开发者来说,都是不可或缺的参考资料。这本书深入浅出地介绍了如何在Java环境中有效地管理和控制并发...

    java并发编程实战.zip

    1. **Java并发基础**:介绍Java并发编程的基础知识,包括线程的创建与使用、线程的状态模型(新建、运行、阻塞、等待、终止)以及Java中的Thread类和Runnable接口。 2. **同步机制**:讲解了Java中的基本同步机制,...

Global site tag (gtag.js) - Google Analytics