跳至主要內容
深入浅出 Java 的魔法类 Unsafe

第二十八节:魔法类 Unsafe

前面我们在讲 CAS原子操作 atomic 类的时候,都讲到了 Unsafe。

Unsafe 是 Java 中一个非常特殊的类,它为 Java 提供了一种底层、"不安全"的机制来直接访问和操作内存、线程和对象。正如其名字所暗示的,Unsafe 提供了许多不安全的操作,因此它的使用应该非常小心,并限于那些确实需要使用这些底层操作的场景。


沉默王二大约 23 分钟Java核心Java并发编程
获取 Java 线程执行结果:Callable、Future和FutureTask

第二节:获取线程的执行结果

在第一节:初步掌握 Java 多线程中,我们讲述了创建线程的 3 种方式,一种是直接继承 Thread,一种是实现 Runnable 接口,另外一种是实现 Callable 接口。

前 2 种方式都有一个缺陷:在执行完任务之后无法获取执行结果。

如果需要获取执行结果,就必须通过共享变量或者线程通信的方式来达到目的,这样使用起来就比较麻烦。


沉默王二大约 6 分钟Java核心Java并发编程
深入浅出偏向锁

第十一节:深入浅出偏向锁

在 JDK 1.5 之前,面对 Java 并发问题, synchronized 是一招鲜的解决方案:

  1. 同步方法,锁上当前实例对象
  2. 同步静态方法,锁上当前类的 Class 对象
  3. 同步块,锁上代码块里面配置的对象

拿同步块来举例:

public void test(){
  synchronized (object) {
    i++;
  }
}

沉默王二大约 19 分钟Java核心Java并发编程
公司空降一个美团大佬,彻底把Java中的锁”讲清楚了

前言

Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8和Netty 3.10.6)、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。

Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识。下面给出本文内容的总体分类目录:


沉默王二大约 31 分钟Java核心Java并发编程
面了一个25岁的学妹,把synchronized关键字讲的那叫一个透彻

第九节:synchronized关键字

“三妹,今天我们来学习 synchronized 关键字吧。”我瞅了一眼坐在沙发上的三妹说,她正在王者荣耀呢。

三妹(颜值在线,气质也在线)喝了一口冰可乐接着说:“好的,二哥。马上,打完这把,看我三杀。”

在 Java 中,关键字 synchronized 可以保证在同一个时刻,只有一个线程可以执行某个方法或者某个代码块(主要是对方法或者代码块中存在共享数据的操作),同时我们还应该注意到 synchronized 的另外一个重要的作用,synchronized 可保证一个线程的变化(主要是共享数据的变化)被其他线程所看到(保证可见性,完全可以替代 volatile 功能)。


沉默王二大约 11 分钟Java核心Java并发编程
吊打Java并发面试官之阻塞队列BlockingQueue

第二十二节:阻塞队列 BlockingQueue

BlockingQueue 是 Java 中的一个接口,它代表了一个线程安全的队列,不仅可以由多个线程并发访问,还添加了等待/通知机制,以便在队列为空时阻塞获取元素的线程,直到队列变得可用,或者在队列满时阻塞插入元素的线程,直到队列变得可用。

最常见的"生产者-消费者"问题中,队列通常被视作线程间的数据容器,生产者将“生产”出来的数据放入数据容器,消费者从“数据容器”中获取数据,这样,生产者线程和消费者线程就解耦了,各自只需要专注自己的业务即可。


沉默王二大约 20 分钟Java核心Java并发编程
吊打Java并发面试官之ConcurrentHashMap(线程安全的哈希表)

第二十节:并发容器 ConcurrentHashMap

ConcurrentHashMap 是 Java 并发包 (java.util.concurrent) 中的一种线程安全的哈希表实现。

HashMap 在多线程环境下扩容会出现 CPU 接近 100% 的情况,因为 HashMap 并不是线程安全的,我们可以通过 Collections 的Map<K,V> synchronizedMap(Map<K,V> m)将 HashMap 包装成一个线程安全的 map。


沉默王二大约 27 分钟Java核心Java并发编程
吊打Java并发面试官之线程安全的队列实现ConcurrentLinkedQueue

第二十一节:非阻塞队列ConcurrentLinkedQueue

ConcurrentLinkedQueue 是 java.util.concurrent(JUC) 包下的一个线程安全的队列实现。基于非阻塞算法(Michael-Scott 非阻塞算法的一种变体),这意味着 ConcurrentLinkedQueue 不再使用传统的锁机制来保护数据安全,而是依靠底层原子的操作(如 CAS)来实现。


沉默王二大约 20 分钟Java核心Java并发编程
Java并发编程通信工具类 Semaphore、Exchanger、CountDownLatch、CyclicBarrier、Phaser等一网打尽

第二十九节:通信工具类

JDK 中提供了一些并发编程中常用的通信工具类以供我们开发者使用,比如说 CountDownLatch,Semaphore,Exchanger,CyclicBarrier,Phaser。

它们都在 JUC 包下。先总体概括一下都有哪些工具类,它们有什么作用,然后再分别介绍它们的主要使用方法和原理。

作用
Semaphore 限制线程的数量
Exchanger 两个线程交换数据
CountDownLatch 线程等待直到计数器减为 0 时开始工作
CyclicBarrier 作用跟 CountDownLatch 类似,但是可以重复使用
Phaser 增强的 CyclicBarrier

沉默王二大约 16 分钟Java核心Java并发编程
2
3
4