跳至主要內容
《极客时间教程 - Java 并发编程实战》笔记三

《极客时间教程 - Java 并发编程实战》笔记三

Immutability 模式:如何利用不变性解决并发问题?

解决并发问题,其实最简单的办法就是让共享变量只有读操作,而没有写操作。这个办法如此重要,以至于被上升到了一种解决并发问题的设计模式:不变性(Immutability)模式。所谓不变性,简单来讲,就是对象一旦被创建之后,状态就不再发生变化。换句话说,就是变量一旦被赋值,就不允许修改了(没有写操作);没有修改操作,也就是保持了不变性。

快速实现具备不可变性的类


钝悟...大约 40 分钟笔记JavaJava并发
《极客时间教程 - Java 并发编程实战》笔记四

《极客时间教程 - Java 并发编程实战》笔记四

案例分析(一):高性能限流器 Guava RateLimiter

Guava 是 Google 开源的 Java 类库,提供了一个工具类 RateLimiter。

【示例】使用 RateLimiter 限流

//限流器流速:2 个请求/秒
RateLimiter limiter = RateLimiter.create(2.0);
//执行任务的线程池
ExecutorService es = Executors.newFixedThreadPool(1);
//记录上一次执行时间
prev = System.nanoTime();
//测试执行 20 次
for (int i = 0; i < 20; i++) {
    //限流器限流
    limiter.acquire();
    //提交任务异步执行
    es.execute(() -> {
        long cur = System.nanoTime();
        //打印时间间隔:毫秒
        System.out.println((cur - prev) / 1000_000);
        prev = cur;
    });
}

// 输出结果:
// ...
// 500
// 499
// 500
// 499

钝悟...大约 38 分钟笔记JavaJava并发
《极客时间教程 - Java 并发编程实战》笔记一

《极客时间教程 - Java 并发编程实战》笔记一

学习攻略 如何才能学好并发编程?

开篇词 你为什么需要学习并发编程?

并发编程可以总结为三个核心问题:分工、同步、互斥。


钝悟...大约 26 分钟笔记JavaJava并发
《极客时间教程 - Java 并发编程实战》笔记二

《极客时间教程 - Java 并发编程实战》笔记二

Lock 和 Condition(上):隐藏在并发包中的管程

再造管程的理由

已有 synchronized,还支持 Lock 的原因是,需要一把锁支持:

  1. 能够响应中断。synchronized 的问题是,持有锁 A 后,如果尝试获取锁 B 失败,那么线程就进入阻塞状态,一旦发生死锁,就没有任何机会来唤醒阻塞的线程。但如果阻塞状态的线程能够响应中断信号,也就是说当我们给阻塞的线程发送中断信号的时候,能够唤醒它,那它就有机会释放曾经持有的锁 A。这样就破坏了不可抢占条件了。
  2. 支持超时。如果线程在一段时间之内没有获取到锁,不是进入阻塞状态,而是返回一个错误,那这个线程也有机会释放曾经持有的锁。这样也能破坏不可抢占条件。
  3. 非阻塞地获取锁。如果尝试获取锁失败,并不进入阻塞状态,而是直接返回,那这个线程也有机会释放曾经持有的锁。这样也能破坏不可抢占条件。

钝悟...大约 43 分钟笔记JavaJava并发
Java 并发面试三

Java 并发面试三

ThreadLocal

ThreadLocal 有什么用?

通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢?

JDK 中自带的ThreadLocal类正是为了解决这样的问题。 ThreadLocal类主要解决的就是让每个线程绑定自己的值,可以将ThreadLocal类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。


钝悟...大约 50 分钟JavaJavaCore面试JavaJavaSE面试并发
Java 并发面试二

Java 并发面试二

JMM(Java 内存模型)

JMM(Java 内存模型)相关的问题比较多,也比较重要,于是我单独抽了一篇文章来总结 JMM 相关的知识点和问题:JMM(Java 内存模型)详解

乐观锁和悲观锁

什么是悲观锁?


钝悟...大约 22 分钟JavaJavaCore面试JavaJavaSE面试并发
Java 虚拟机面试一

Java 虚拟机面试一

引用类型

Java 支持哪些引用类型?分别用于什么场景?

无论是通过引用计算算法判断对象的引用数量,还是通过可达性分析算法判断对象的引用链是否可达,判定对象是否可被回收都与引用有关。

Java 具有四种强度不同的引用类型:

  • 强引用(Strong Reference)
  • 软引用(Soft Reference)
  • 弱引用(Weak Reference)
  • 虚引用

(1)强引用


钝悟...大约 2 分钟JavaJavaCore面试JavaJavaSE面试并发
Java 并发之内存模型

Java 并发之内存模型

Java 内存模型(Java Memory Model),简称 JMM。Java 内存模型的目标是为了解决由可见性和有序性导致的并发安全问题。Java 内存模型通过 屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果

物理内存模型

物理机遇到的并发问题与虚拟机中的情况有不少相似之处,物理机对并发的处理方案对于虚拟机的实现也有相当大的参考意义。

硬件处理效率存在很大差异


钝悟...大约 42 分钟JavaJavaCore并发JavaJavaCore并发JMMHappens-Before内存屏障volatilesynchronizedfinal指令重排序
Java 并发之分工工具

Java 并发之分工工具

对于简单的并行任务,你可以通过“线程池 + Future”的方案来解决;如果任务之间有聚合关系,无论是 AND 聚合还是 OR 聚合,都可以通过 CompletableFuture 来解决;而批量的并行任务,则可以通过 CompletionService 来解决。

FutureTask

FutureTask 有两个构造函数:

FutureTask(Callable<V> callable);
FutureTask(Runnable runnable, V result);

钝悟...大约 12 分钟JavaJavaCore并发JavaJavaCore并发FutureTaskCompletableFutureCompletionStageCompletionServiceForkJoinPool
Java 并发

Java 并发

Java 并发总结、整理 Java 并发编程相关知识点。

并发编程并非 Java 语言所独有,而是一种成熟的编程范式,Java 只是用自己的方式实现了并发工作模型。学习 Java 并发编程,应该先熟悉并发的基本概念,然后进一步了解并发的特性以及其特性所面临的问题。掌握了这些,当学习 Java 并发工具时,才会明白它们各自是为了解决什么问题,为什么要这样设计。通过这样由点到面的学习方式,更容易融会贯通,将并发知识形成体系化。

📖 内容


钝悟...大约 2 分钟JavaJavaCore并发JavaJavaCore并发
2