摘要:
前言 算法分析是对一个算法需要多少计算时间和存储空间作定量分析。此文主要介绍如何使用渐近分析记号来表示算法的时间复杂度以及如何对算法效率进行比较。 分析涉及的概念 输入规模度量 算法的时间效率和空间效率都用输入规模的函数进行度量 对相同大小的输入实例具有相同的分析结果 对于所有的算法,对于规模更大的 阅读全文
摘要:
前言 很久之前用过Atom以及其他一些软件来写markdown,但用起来都不是很顺手。后来被人安利了Typora,从此它便成为了我写markdown的不二之选。使用Typora来记markdown本地笔记是很舒服的,但是将含有图片的本地笔记发布为博客时就会让人有点头疼。笔记中的图片就需要一张一张地手 阅读全文
摘要:
前言 为保证计数器中 的原子性,我们在前面使用的都是 互斥锁方案,加锁独占访问的方式未免太过霸道,于是我们来介绍另一种解决原子性问题的 无锁方案:原子变量 。在正式介绍原子变量之前,我们先来总结下锁的不足,然后深入介绍原子变量。 锁的劣势 通过对共享变量加锁,使得获取到锁的线程可以采用独占方式来访问 阅读全文
摘要:
前言 Java并发包有很大一部分都是关于并发容器的。Java在5.0版本之前线程安全的容器称之为 同步容器 。同步容器实现线程安全的方式:是将每个公有方法都使用 修饰,保证每次只有一个线程能访问容器的状态。但是这样的串行度太高,将严重降低并发性,当多个线程竞争容器的锁时,吞吐量将严重降低。因此,在J 阅读全文
摘要:
前言 下面介绍协调让多线程步调一致的两个工具类: 和`CyclicBarrier`。 CountDownLatch和CyclicBarrier的用途介绍 CountDownLatch 是一个同步工具类, 在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待 。可以指定计数初始化Cou 阅读全文
摘要:
前言 适用于读多写少的场景,允许多个线程同时读取共享变量。但在读多写少的场景中,还有更快的技术方案。在Java 1.8中, 提供了 锁,它的性能就比读写锁还要好。下面我们介绍StampedLock的使用方法、内部工作原理以及在使用过程中需要注意的事项。 StampedLock支持的三种锁模式 支持两 阅读全文
摘要:
前言 前面介绍过 ,它实现的是一种标准的互斥锁:每次最多只有一个线程能持有ReentrantLock。这是一种强硬的加锁规则,在某些场景下会限制并发性导致不必要的抑制性能。互斥是一种保守的加锁策略,虽然可以避免“写/写”冲突和“写/读”冲突,但是同样也避免了“读/读”冲突。 在读多写少的情况下,如果 阅读全文
摘要:
前言 1965年,荷兰计算机科学家Dijkstra提出的信号量机制成为一种高效的进程同步机制。这之后的15年,信号量一直都是并发编程领域的终结者。1980年,管程被提出,成为继信号量之后的在并发编程领域的第二个选择。目前几乎所有的语言都支持信号量机制,Java也不例外。Java中提供了 并发工具类来 阅读全文
摘要:
前言 Java SDK并发包通过 和`Condition synchronized`实现了管程的,那么为什么还在SDK中提供另外一种实现呢?欲知为何请看下文。 下面将先阐述再造管程的理由,然后详细介绍Lock和Condition,最后再看实现同步机制时是选择synchronized还是SDK中的管程 阅读全文
摘要:
前言 下面简单总结学习Java并发的笔记,关于如何利用面向对象思想写好并发程序的建议。面向对象的思想和并发编程属于两个领域,但是在Java中这两个领域却可以融合到一起。在Java语言中,面向对象编程的思想能够让并发编程变得更加简单。下面将从封装共享变量、识别共享变量间的约束条件和制定并发访问策略三方 阅读全文