全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📝 1 篇文章 20 道配套习题

线程安全与同步机制专题

专题说明

本专题系统讲解Java线程安全与同步机制的核心知识点,多线程编程中线程安全是关键问题,掌握同步机制是写出高质量并发程序的必备技能。

学习目标

  1. 掌握synchronized关键字的使用方式与锁升级机制
  2. 理解volatile关键字的内存语义与适用场景
  3. 掌握ReentrantLock的使用方法及与synchronized的区别
  4. 理解原子类的CAS原理与ABA问题
  5. 掌握线程安全集合的原理与选择
  6. 熟练使用CountDownLatch、CyclicBarrier、Semaphore等并发工具类

学习内容

本专题涵盖六大核心知识点:

知识点核心内容
synchronized关键字锁对象、锁升级、可重入性
volatile关键字内存可见性、禁止重排序、不保证原子性
Lock接口与ReentrantLock显式加锁解锁、公平锁、tryLock
原子类(Atomic)CAS原理、ABA问题、原子累加器
线程安全集合ConcurrentHashMap、CopyOnWriteArrayList
并发工具类CountDownLatch、CyclicBarrier、Semaphore

学习建议

  1. 理解JMM模型:线程安全问题的根源是内存模型,理解可见性、有序性、原子性是基础
  2. 对比学习:synchronized与ReentrantLock、volatile与synchronized的区别是高频考点
  3. 动手验证:并发编程问题难以凭直觉判断,建议写代码验证各种场景
  4. 注意场景选择:不同同步机制有不同的适用场景,选择合适的工具是关键

📝 发现内容有误?点击此处直接编辑

📝 配套习题(20 题)

1
判断题

synchronized关键字修饰普通方法时,锁对象是当前实例对象(this);修饰静态方法时,锁对象是当前类的Class对象。

A

B

2
单选题

关于Java中synchronized关键字的锁升级过程,以下说法正确的是?

A

synchronized只能使用重量级锁,每次都会阻塞线程

B

锁升级顺序是:无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁,且只能升级不能降级

C

锁升级后性能会越来越好

D

偏向锁在竞争激烈时性能最优

3
多选题

关于synchronized关键字,以下说法正确的有?

A

synchronized是Java内置关键字,会自动释放锁

B

synchronized可以修饰代码块、方法和接口

C

synchronized是可重入锁,同一个线程可以多次获取同一把锁

D

synchronized可以响应中断,线程等待锁时可以被中断

4
判断题

volatile关键字可以保证变量的可见性,但不能保证复合操作的原子性。

A

B

5
单选题

关于volatile关键字的内存语义,以下说法正确的是?

A

volatile变量的写操作会插入StoreStore屏障,防止上面的普通写与下面的volatile写重排序

B

volatile变量的读操作会插入LoadLoad屏障,防止下面的普通读与上面的volatile读重排序

C

volatile只能保证可见性,不能禁止任何类型的指令重排序

D

volatile变量不需要从主内存读取,每个线程都有自己的副本

6
多选题

以下哪些场景适合使用volatile关键字?

A

状态标志位,如控制线程循环退出的boolean变量

B

单例模式中双重检查锁定的实例变量

C

多线程环境下对计数器进行递增操作

D

独立观察,如定期更新某个值供其他线程读取

7
判断题

ReentrantLock实现了Lock接口,它支持公平锁和非公平锁两种模式,并且是可重入锁。

A

B

8
单选题

关于Lock接口的方法,以下说法错误的是?

A

lock()方法获取锁,如果锁不可用则阻塞等待

B

tryLock()方法尝试获取锁,立即返回结果,不会阻塞

C

lockInterruptibly()方法获取锁时可响应中断

D

newCondition()方法返回一个Object对象用于等待/通知机制

9
多选题

关于synchronized和ReentrantLock的区别,以下说法正确的有?

A

synchronized是Java关键字,ReentrantLock是JUC包下的类

B

synchronized自动释放锁,ReentrantLock需要手动释放锁

C

synchronized只能是非公平锁,ReentrantLock可以选择公平锁或非公平锁

D

synchronized和ReentrantLock都是可重入锁

10
判断题

Java中的原子类(如AtomicInteger)通过CAS(Compare-And-Swap)机制实现原子操作,CAS操作不需要加锁就能保证线程安全。

A

B

11
单选题

关于CAS操作的ABA问题,以下说法正确的是?

A

ABA问题是指值从A变成B再变成A,CAS检测不到变化可能产生错误

B

ABA问题只能通过加锁解决,无法通过乐观锁方式解决

C

Java的AtomicStampedReference通过加锁解决ABA问题

D

ABA问题在所有场景下都会导致数据错误

12
多选题

以下属于Java JUC包中原子类的有?

A

AtomicInteger

B

AtomicReference

C

AtomicStampedReference

D

AtomicLongArray

13
判断题

Java 8中的ConcurrentHashMap使用了CAS+synchronized来保证线程安全,放弃了Java 7中的分段锁设计。

A

B

14
单选题

关于CopyOnWriteArrayList,以下说法错误的是?

A

写操作时会复制整个数组,适合读多写少的场景

B

迭代器遍历时不会抛出ConcurrentModificationException

C

写操作的性能很高,和ArrayList相当

D

迭代器遍历时不能通过迭代器的remove方法删除元素

15
多选题

以下哪些是Java中线程安全的集合类?

A

ConcurrentHashMap

B

Hashtable

C

Collections.synchronizedList(new ArrayList<>())

D

CopyOnWriteArraySet

16
单选题

以下场景中,最适合使用CountDownLatch的是?

A

10个线程并发执行,要求所有线程都到达某个点后再一起继续执行

B

主线程等待5个子线程完成后再执行后续逻辑

C

限制同一时间最多有3个线程访问某个资源

D

多个线程周期性地执行任务,每轮都互相等待

17
多选题

关于CountDownLatch、CyclicBarrier和Semaphore,以下说法正确的有?

A

CountDownLatch的计数器只能递减,不能递增

B

CyclicBarrier可以指定一个Runnable任务,在所有线程到达屏障后执行

C

Semaphore的tryAcquire()方法在许可不足时返回false,不会阻塞

D

这三个工具类都位于java.util.concurrent包中

18
单选题

在一个多线程任务处理系统中,需要实现以下需求:主线程启动10个工作线程处理任务,所有工作线程完成后,主线程汇总结果并启动下一批任务。以下哪种方案最合适?

A

使用synchronized关键字保护共享计数器变量

B

使用Semaphore限制并发线程数为10个

C

使用CountDownLatch初始化为10,主线程await等待

D

使用CyclicBarrier设置parties为11(10个工作线程+1个主线程)

19
单选题

关于synchronized和volatile的内存语义,以下说法正确的是?

A

volatile只能保证可见性,synchronized可以保证可见性和原子性

B

volatile和synchronized都会造成线程阻塞

C

volatile关键字可以修饰方法

D

synchronized不能禁止指令重排序

20
单选题

在读多写少的场景下,以下哪种同步机制性能最优?

A

synchronized关键字

B

ReentrantLock

C

ReentrantReadWriteLock

D

AtomicReference

← 上一个专题 泛型详解专题
下一个专题 → 网络编程基础专题

📝 发现内容有误?点击此处直接编辑

想查看更多习题和详细解析?
小程序提供完整的题库和详细解析

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库