排序算法
本文用于将常见的排序算法做一个总结。
本文用于将常见的排序算法做一个总结。
TCP 和 UDP 是 TCP/IP 协议簇中十分重要的两个协议,它们均位于运输层。之前的文章《三次握手和四次挥手》介绍了 TCP 中建立连接和释放连接的过程,解释了详细的步骤。但由于意外或者其它原因,TCP 在传输的过程中并不是一帆风顺的。所以,本文主要介绍 TCP 和 UDP 的区别、TCP 流量控制、拥塞控制、超时重传、可靠传输的实现过程,分析在各种意外情况下 TCP 是如何保证可靠传输的。
“三次握手”和“四次挥手”是 TCP 进行传输连接所涉及到的关键步骤,即建立 TCP 连接和释放 TCP 连接。当然,在这两者之间还有“数据传输”这一环节。本文主要讨论的是 TCP 建立连接以及释放连接的过程,并讨论为什么要这么设计等相关问题。
之前或多或少接触过几种设计模式,只不过没有好好的总结。本文用于记录自己在设计模式方面的学习过程,在学习期间阅读了有关设计模式的书籍,挑选了博客园中优秀的文章,搜集网上的资料并进行了筛选,也看过别人对设计模式的总结。只是单纯看的话,会容易忘记。因此,我一般喜欢“输出式学习”,将学过的知识与自己对知识的理解整理下来,构建一套属于自己的知识体系。即便以后忘记了,也会通过浏览对原有知识的总结,很快重新拾起这部分的知识。
上篇文章《Java 中的 AQS》 对 AbstractQueuedSynchronizer 中的方法及实现方式做了详细的解释。有了 AQS 和 CAS 的基础以后,我们再来分析 ReentrantLock 就会更加容易一些。
之前的《Java 中的 Lock 及各种锁的概念》简单介绍了 Lock 的使用以及 Lock 的唯一实现类 ReentrantLock 中的方法。我们一般会拿 synchronized 和 ReentrantLock 做比较。而在了解 ReentrantLock 之前需要理解 AQS 的实现。因此,本文分析了 AQS 中主要的源码,包括独占模式与共享模式,为更好的认识 ReentrantLock 打下基础。
为了在多线程并发的情况下能够保证多个线程对数据进行合理的访问,避免出现并发情况下的线程安全问题,Java 从 JDK1.5 开始提供了 java.util.concurrent.atomic 包,它可以通过原子操作类
来对某个变量实现更加简单、线程安全的更新操作。
在某些读多写少
的多线程环境下,基于 CopyOnWrite 思想的 CopyOnWriteArrayList 容器和 CopyOnWriteArraySet 容器可以保证线程安全,能够确保读操作和写操作之间不会被阻塞。本文将会从 线程不安全的 ArrayList 入手,由 CopyOnWrite 思想引申到 CopyOnWriteArrayList,通过示例说明它是怎么保证线程安全的,适用的场景,最后对其进行总结。
在 JDK 1.5 中的 java.util.concurrent 包下,有一些在并发情况下控制线程的工具类,有的可以控制并发流程,而有的可以交换线程之间的数据。通过这些辅助类可以更好的帮助我们进行并发编程,而本文主要介绍 CountDownLatch、CyclicBarrier、Semaphore、Exchanger 这四个并发工具类。
在之前的《Java 中的线程池》一文中,在介绍线程池参数的时候,其中BlockingQueue<Runnable> workQueue
用于存储等待执行的任务,提到了几种不同类型的等待队列。本文将详细的介绍阻塞队列的实现原理以及各自的使用方法。