并发编程原理与实战(十八)ReentrantLock API全面解析

Java并发锁机制全解析:从synchronized到StampedLock的实战指南 在并发编程中,锁是保证线程安全的核心机制,用于解决多线程环境下的原子性、可见性和有序性问题。其原理是通过同步机制控制对共享资源的访问,确保数据一致性。锁的技术价值在于提升程序执行效率与稳定性,避免竞态条件导致的数据错误。应用场景涵盖数据库连接池、缓存系统、高并发服务等需要协调多线程访问的领域。本文聚焦Java并发包中的锁工具,深入剖析synchronized、ReentrantLock等锁机制,并结合StampedLock的乐观读特性,探讨如何根据实际场景选择合适的锁策略,优化系统性能。 阅读详情

上一篇讲解了Lock接口核心API和相比于synchronized的关键优势,本文来进一步学习Lock接口的具体实现类ReentrantLock。

认识ReentrantLock

基本行为和语义

下面我们先看ReentrantLock的定义。

/**
 * A reentrant mutual exclusion {@link Lock} with the same basic
 * behavior and semantics as the implicit monitor lock accessed using
 * {@code synchronized} methods and statements, but with extended
 * capabilities.
 */

ReentrantLock是一种可重入的互斥锁Lock,其基本行为和语义与通过synchronized方法及语句访问的隐式监视器锁相同,但具备扩展功能。

那么synchronized有哪些基本行为和语义呢?通过前面文章的学习,我们已经知道synchronized具有上锁、解锁、互斥访问等行为,这些就是基本行为。synchronized修饰的方法或语句块所有操作作为一个不可分割的整体执行,也就是具有原子性;线程在释放锁之前会将共享变量的修改刷新到主内存,其他线程在获取锁后能立即看到最新值,也就是可见性;同一线程可以多次获取同一把锁,也就是可重入性。

/* <p>A {@code ReentrantLock} is <em>owned</em> by the thread last
 * successfully locking, but not yet unlocking it. A thread invoking
 * {@code lock} will return, successfully acquiring the lock, when
 * the lock is not owned by another thread. The method will return
 * immediately if the current thread already owns the lock. This can
 * be checked using methods {@link #isHeldByCurrentThread}, and {@link
 * #getHoldCount}.
 */

ReentrantLock的所有权归属于最后一个成功加锁但尚未解锁的线程。当锁未被其他线程持有时,调用lock()方法的线程将成功获取锁并返回。若当前线程已持有该锁,则此方法立即返回。可通过方法 isHeldByCurrentThread和 getHoldCount验证锁状态。

/* <p>The constructor for this class accepts an optional
 * <em>fairness</em> parameter.  When set {@code true}, under
 * contention, locks favor granting access to the longest-waiting
 * thread.  Otherwise this lock does not guarantee any particular
 * access order.  Programs using fair locks accessed by many threads
 * may display lower overall throughput (i.e., are slower; often much
 * slower) than those using the default setting, but have smaller
 * variances in times to obtain locks and guarantee lack of
 * starvation. Note however, that fairness of locks does not guarantee
 * fairness of thread scheduling. Thus, one of many threads using a
 * fair lock may obtain it multiple times in succession while other
 * active threads are not progressing and not currently holding the
 * lock.
 * Also note that the untimed {@link #tryLock()} method does not
 * honor the fairness setting. It will succeed if the lock
 * is available even if other threads are waiting.
 */

公平性设置

该类的构造函数接受一个可选的公平性参数,当设置为true时,在竞争条件下,锁优先授予等待时间最长的线程。否则,此锁不保证任何特定访问顺序。使用公平锁的多线程程序可能比默认设置(非公平锁)的整体吞吐量更低(即更慢,通常显著更慢), 但获取锁的时间波动更小,且能避免线程饥饿。需注意:锁的公平性并不保证线程调度的公平性。因此,当其他活跃线程未持有锁且未推进时,使用公平锁的某个线程可能连续多次获得锁。

另请注意:非超时的tryLock()方法不遵循公平性设置,只要锁可用,即使其他线程正在等待,它也会成功。

推荐用法

强烈建议在调用 lock()方法后立即使用 try 代码块,典型结构如下所示:

class X {
  private final ReentrantLock lock = new ReentrantLock();
  // ... 
  public void m() {
    lock.lock();  // 阻塞直至获取锁
    try {
      // ... 方法逻辑
    } finally {
      lock.unlock(); // 确保释放锁
    }
  }
}

其他特性

/* <p>In addition to implementing the {@link Lock} interface, this
 * class defines a number of {@code public} and {@code protected}
 * methods for inspecting the state of the lock.  Some of these
 * methods are only useful for instrumentation and monitoring.
 *
 * <p>Serialization of this class behaves in the same way as built-in
 * locks: a deserialized lock is in the unlocked state, regardless of
 * its state when serialized.
 *
 * <p>This lock supports a maximum of 2147483647 recursive locks by
 * the same thread. Attempts to exceed this limit result in
 * {@link Error} throws from locking methods.
 */

除了实现Lock接口的方法外,此类还定义了若干用于检查锁状态的, public和protected 方法。其中部分方法仅适用于监控工具和状态跟踪。

该类的序列化(将 Java 对象转换为字节流(byte[]),用于保存到文件、数据库或网络传输等)行为与内置锁一致:无论序列化时的状态如何,反序列化(将字节流恢复为原始对象状态的过程)后的锁均处于未锁定状态。此锁支持同一线程最多递归加锁 2147483647 次(2147483647 层嵌套锁定)。尝试超出该限制将导致加锁方法抛出错误。

API详解

ReentrantLock除了实现Lock接口的6个基础方法外,还实现了其他方法,下面我们主要对其他方法进行分析。
在这里插入图片描述

公平性控制

通过构造函数创建ReentrantLock实例时指定参数来控制公平性。

/**
 * Creates an instance of {@code ReentrantLock}.
 * This is equivalent to using {@code ReentrantLock(false)}.
 */
public ReentrantLock() {
    sync = new NonfairSync();
}

该构造函数创建一个ReentrantLock类型的实例,相当于使用构造函数ReentrantLock(false)创建实例。

/**
 * Creates an instance of {@code ReentrantLock} with the
 * given fairness policy.
 *
 * @param fair {@code true} if this lock should use a fair ordering policy
 */
public ReentrantLock(boolean fair) {
    sync = fair ? new FairSync() : new NonfairSync();
}

该构造函数根据给定的公平策略创建一个ReentrantLock实例。参数fair为true时,锁将使用公平的排队抢锁策略。

状态查询与监控

(1)getHoldCount()

/**
 * Queries the number of holds on this lock by the current thread.
 *
 * <p>A thread has a hold on a lock for each lock action that is not
 * matched by an unlock action.
 *
 * <p>The hold count information is typically only used for testing and
 * debugging purposes. For example, if a certain section of code should
 * not be entered with the lock already held then we can assert that
 * fact:
 ...
 *
 * @return the number of holds on this lock by the current thread,
 *         or zero if this lock is not held by the current thread
 */
public int getHoldCount() {
    return sync.getHoldCount();
}

该方法查询当前线程对此锁的持有次数。线程每次未匹配解锁操作的锁操作都会持有该锁。持有计数信息通常仅用于测试和调试目的。例如,如果某个代码段不应在锁已被持有时进入,则我们可以断言这一事实:

class X {
    final ReentrantLock lock = new ReentrantLock();
    // ...
    public void m() {
      assert lock.getHoldCount() == 0;
      lock.lock();
      try {
        // ... method body
      } finally {
        lock.unlock();
      }
}

该方法返回当前线程持有该锁的次数,或者返回0如果当前线程没有持有该锁。

(2)isHeldByCurrentThread()

/**
 * Queries if this lock is held by the current thread.
 *
 * <p>Analogous to the {@link Thread#holdsLock(Object)} method for
 * built-in monitor locks, this method is typically used for
 * debugging and testing. For example, a method that should only be
 * called while a lock is held can assert that this is the case:
 ...
 * @return {@code true} if current thread holds this lock and
 *         {@code false} otherwise
 */
public boolean isHeldByCurrentThread() {
    return sync.isHeldExclusively();
}

该方法查询当前线程是否持有该锁,该方法类似于内置监视器锁的Thread类的holdsLock(Object)方法,通常用于调试和测试。例如,若某方法仅应在持有锁时调用,可通过此方法断言当前状态:

 class X {
   final ReentrantLock lock = new ReentrantLock();
   // ...
   public void m() {
       assert lock.isHeldByCurrentThread();
       // ... method body
   }
 }

该断言也可用于确保以非重入方式使用可重入锁,例如:

  class X {
    final ReentrantLock lock = new ReentrantLock();
    // ...
    public void m() {
        assert !lock.isHeldByCurrentThread();
        lock.lock();
        try {
            // ... method body
        } finally {
            lock.unlock();
        }
    }
  }

(3)isLocked()

/**
 * Queries if this lock is held by any thread. This method is
 * designed for use in monitoring of the system state,
 * not for synchronization control.
 *
 * @return {@code true} if any thread holds this lock and
 *         {@code false} otherwise
 */
public boolean isLocked() {
    return sync.isLocked();
}

该方法查询这个锁是否被当前线程持有,该方法用于监控系统的状态,而不是用来做同步控制。如果当前线程持有该锁将返回true,否则返回false。

(4)isFair()

/**
 * Returns {@code true} if this lock has fairness set true.
 *
 * @return {@code true} if this lock has fairness set true
 */
public final boolean isFair() {
    return sync instanceof FairSync;
}

该方法返回这个锁是否设置了公平性,如果设置了则返回true。

(5)hasQueuedThreads()

/**
 * Queries whether any threads are waiting to acquire this lock. Note that
 * because cancellations may occur at any time, a {@code true}
 * return does not guarantee that any other thread will ever
 * acquire this lock.  This method is designed primarily for use in
 * monitoring of the system state.
 *
 * @return {@code true} if there may be other threads waiting to
 *         acquire the lock
 */
public final boolean hasQueuedThreads() {
    return sync.hasQueuedThreads();
}

该方法 查询是否有线程正在等待获取此锁。需注意,由于线程取消可能随时发生,返回true并不保证其他线程最终会获得此锁。此方法主要用于监控系统状态。如果有线程正在等待获取锁,则返回true。

hasQueuedThread(Thread thread)则是查询给定的线程是否正在等待获取此锁。

(6)getQueueLength()

/**
 * Returns an estimate of the number of threads waiting to acquire
 * this lock.  The value is only an estimate because the number of
 * threads may change dynamically while this method traverses
 * internal data structures.  This method is designed for use in
 * monitoring system state, not for synchronization control.
 *
 * @return the estimated number of threads waiting for this lock
 */
public final int getQueueLength() {
    return sync.getQueueLength();
}

该方法返回等待获取此锁的线程数估计值。该值仅为估算,因为此方法遍历内部数据结构时,线程数量可能动态变化。此方法设计用于监控系统状态,而非用于同步控制。

/**
 * Queries whether any threads are waiting on the given condition
 * associated with this lock. Note that because timeouts and
 * interrupts may occur at any time, a {@code true} return does
 * not guarantee that a future {@code signal} will awaken any
 * threads.  This method is designed primarily for use in
 * monitoring of the system state.
 *
 * @param condition the condition
 * @return {@code true} if there are any waiting threads
 * @throws IllegalMonitorStateException if this lock is not held
 * @throws IllegalArgumentException if the given condition is
 *         not associated with this lock
 * @throws NullPointerException if the condition is null
 */
public boolean hasWaiters(Condition condition) {
    if (condition == null)
        throw new NullPointerException();
    if (!(condition instanceof AbstractQueuedSynchronizer.ConditionObject))
        throw new IllegalArgumentException("not owner");
    return sync.hasWaiters((AbstractQueuedSynchronizer.ConditionObject)condition);
}

该方法查询是否有线程正在等待与此锁关联的给定条件。需注意,由于超时和中断可能随时发生,返回 true并不保证未来的 signal 会唤醒任何线程。此方法主要用于监控系统状态。

  • @param condition 条件
  • @return 如果有等待线程存在则返回true
  • @throws IllegalMonitorStateException 如果线程未持有此锁
  • @throws IllegalArgumentException 如果给定条件与此锁不关联
  • @throws NullPointerException 如果给定的条件为null

int getWaitQueueLength(Condition condition)方法则是返回正在等待与此锁关联的给定条件的线程数量。

总结

ReentrantLock 方法总览

分类‌方法‌‌功能描述‌‌注意事项‌
基础锁操作void lock()阻塞式获取锁,支持重入(同一线程可多次加锁)必须在 finally 块中调用 unlock() 避免死锁
基础锁操作void unlock()释放锁,重入时需调用次数与 lock() 匹配非锁持有者调用会抛出 IllegalMonitorStateException
‌基础锁操作boolean tryLock()尝试非阻塞获取锁,成功返回 true适用于快速失败逻辑(如避免死锁检测)
基础锁操作boolean tryLock(long, TimeUnit)在指定时间内尝试获取锁,支持中断超时或中断返回 false,需处理 InterruptedException
‌基础锁操作void lockInterruptibly()可中断式获取锁,阻塞期间响应中断需捕获 InterruptedException 并恢复中断状态
‌状态查询‌boolean isLocked()检查锁是否被任何线程持有(包括重入状态)结果仅为瞬时状态,可能因并发变化
‌状态查询boolean isHeldByCurrentThread()当前线程是否持有锁用于调试或条件判断
‌状态查询int getHoldCount()返回当前线程的重入次数计数器归零时锁完全释放
‌队列监控‌int getQueueLength()返回等待锁的线程数(估算值)高并发场景下结果可能不精确
‌队列监控boolean hasQueuedThreads()检查是否有线程在等待队列中通常用于性能监控
‌公平性控制‌ReentrantLock(boolean fair)构造方法:true 为公平锁(按队列顺序),false 为非公平锁(默认)公平锁性能较低,非公平锁吞吐量更高
‌条件变量‌Condition newCondition()创建与锁绑定的 Condition 对象,用于线程间通信类似 Object.wait()/notify(),但更灵活
互联网大厂高频面试题基本总结回顾(含笔试高频算法整理) 1.自我介绍+项目介绍+项目细节/难点提问-------这个主要看个人的经历了,每个人都不一样 2.基础知识点考核---------还是可以去增强自己的,也是这次的主要的一些总结思路 3.算法题-----------一般都是LeetCode高频题,这个得在找工作之前的好好的练习(d对常见的高频题进行总结分析,见对应的链接提示) 阅读详情

相关推荐

【信息科学与工程学】计算机科学与自动化——第三百零四篇 高性能系统开发指南01

高并发:限流、熔断、降级高性能:红包拆分、多级缓存、大Key/热Key拆分、Pipeline、线程池、RocketMQ零丢失、幂等、分布式锁、集群缩容、分批入库海量数据处理:日志分表分片、跨表查询、冷热分层、大数据引擎服务器选型系统安全:网关安全、服务器安全、云存储安全、风控、监控、测试数据一致性:缓存与数据库一致性、大厂方案、蓝绿回滚、流量一致性、流程一致性项目与团队管理:流程问题、管理问题(风险、成本、人员、文档、培训)稳定性建设:上线三板斧、线上五步闭环、混沌工程、容量规划。

weixin_49199313的博客 249

API及性质-ReentrantLock入门-并发编程(Java)

文章目录1、可重入2、可打断3、锁超时4、锁超时解决哲学家进餐问题5、公平锁与不公平锁6、条件变量 1、可重入 可重入是指同一线程如果首次获得了这把锁,那么因为是这把锁的拥有者,因此有权利再次获取这边锁。 /** * 测试ReentrantLock可重入性 */ @Slf4j(topic = "c.TestReentrant") public class TestReentrant { static ReentrantLock lock = new ReentrantLock(); p

gaogzhen的博客 312

java并发编程专题(五)----详解(JUC)ReentrantLock

主要介绍了java(JUC)ReentrantLock的的相关资料,文中讲解非常详细,实例代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下

ReentrantLock api 详解

今天学习ReentrantLock工具类,该类是JUC原子包中的类,通过单元测试代码把所有public api方法跑了一遍,大致了解了底层实现,初学乍练,有很多一知半解的地方,待后续有了深入理解再来补充 package test.java.util.concurrent.locks; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurren

小白爱学习的专栏 766

夜间灯光遥感数据介绍及下载汇总

夜间灯光遥感数据介绍及下载汇总

qq_43874102的博客 1万+

ArcMap投影变换避坑指南:为什么你的坐标转换总出错?常见问题解析与解决方案

本文深入解析ArcMap中坐标转换与投影变换的核心区别与常见陷阱。针对坐标转换总出错的问题,从混淆“定义投影”与“投影变换”、栅格数据重采样选择、矢量数据地理变换参数设置等关键环节,提供清晰的避坑指南与实战解决方案,帮助用户确保空间数据的精确匹配。

weixin_29210727的博客 356

java多线程-ReentrantLock重入锁的使用及常用API

1 ReentrantLock重入锁 和关键字synchronization相比,重入锁有着显示的操作过程。需要手动指定何时加锁,何时释放锁。重入锁对逻辑控制的灵活性要远远优于关键字synchronization。 在退出时,必须记得释放锁,否则其他线程就没有机会访问。 重入锁之所以叫重入锁,是因为这种锁能反复进入。但是只限于一个线程。 //锁定几个就要释放几个 try{ lock.lock()...

weixin_34101784的博客 1005

matplotlib三维画图之观察博弈论混合策略下纳什均衡点

参考链接: 博弈论入门20讲之第16讲-猜谜游戏-散户如何赢庄家 游戏背景: 我的期望是: 你的期望是: 使用Python的matplotlib画图: import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = Axes3D(fig) X = np.linspace(0, 1, 100) Y = np.linspace(0, 1,

敲代码的小风 1258

浅析ReentrantLock的使用

目录 ReentrantLock的API介绍 Condition的API介绍 ReentrantLock的使用实例 一、ReentrantLock的API介绍 ReentrantLock reentrantLock = new ReentrantLock(); /** * 获取锁,如果获取不到锁, 则一直阻塞 ...

Peppa_Pig_0325的博客 306

华硕主板UEFI模式下安装Ubuntu与Windows双系统全攻略

本文详细讲解了在华硕主板UEFI模式下安装Ubuntu与Windows双系统的完整流程。从安装前的BIOS关键设置(如处理安全启动与CSM)、使用GPT分区表,到在Windows中安全分配空间、手动创建Ubuntu分区,最后完成引导配置,提供了避免常见错误的实用技巧,确保双系统稳定共存。

weixin_29199873的博客 345

告别第三方应用!用Android原生API搭建Miracast投屏接收器

本文深入探讨如何利用Android原生API开发Miracast接收器,绕过第三方依赖,实现高效的屏幕共享。通过Wi-Fi P2P直连、反射调用隐藏API和RTSP会话协商等核心技术,为开发者提供了一套完整的Miracast接收端解决方案,适用于多屏协同场景。

weixin_29174141的博客 385

ReentrantLock详解

ReentrantLock是一种可重入的独占锁,它允许同一个线程多次获取同一个锁而不会被阻塞。它的功能类似于synchronized是一种互斥锁,可以保证线程安全。可中断可以设置超时时间可以设置为公平锁支持多个条件变量与 synchronized 一样,都支持可重入它的主要应用场景是在多线程环境下对共享资源进行独占式访问,以保证数据的一致性和安全性。示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

weixin_44906791的博客 1650

具身智能(40):主流 VLA 模型π₀

摘要: π₀是首款专为机器人设计的VLA(视觉-语言-动作)端到端基础模型,通过双阶段训练实现“感知-决策-执行”闭环。其创新点包括:1)FlowMatching技术实现连续平滑动作控制(精度0.3°);2)结合VLM预训练与多机器人实操数据,零样本任务完成率达76.4%,远超同类模型;3)支持模糊指令理解与动态场景适应(如遮挡识别)。开源版本涵盖不同规模模型,适用于工业装配、服务机器人等场景,在延迟(213ms)和稳定性(92%自主恢复率)上显著领先OpenVLA等竞品。

码农17年的博客 509

ReentrantLock原理剖析

ReentrantLock是最常用的锁API,在线程池ThreadPoolExecutor、阻塞队列LinkedBlockingQueue,同步工具CyclicBarrier等中都能看到它的身影。掌握好ReentrantLock的原理,可以让我们更加清楚基于它的实现的其他工具类的实现原理。ReentrantLock实现了类似Syncronized的同步能力,但它还支持了公平锁的能力。根据公平和非公平需要,ReentrantLock持有相应的公平或者非公平的同步器。

GAMELOFT9----纸上得来终觉浅,绝知此事要躬行 1054

Vue3 - Element Plus 日期选择器 el-date-picker,设置 type=week 变成周选择器后,将选择周时修改为 “周一至周日“ 为一组范围(详细示例代码,新手小白秒会)

vue3,element-plus,DatePicker日期选择器,el-date-picker,周,type=week,周选择器,日期选择器week怎么拿到具体的时间范围,如何取week周选择器的value值,format如何设置,时间选择器按周选择时展示具体日期范围,vue3elementPlus日期选择器选择一周7天的数据格式怎么拿到,el-date-picker设置type等于week后怎么设置format属性,format和value-format怎么设置,范围选择器周,一周,选择一周7天时间

🏆 前端领域优质创作者 1万+

YOLO11涨点优化:注意力魔改 | 新颖的多尺度卷积注意力(MSCA),即插即用,助力小目标检测

多尺度卷积注意力(MSCA),有效地提取上下文信息,新颖度高,创新十足。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 6310

Java 并发编程进阶,从线程池、锁、AQS 到并发容器与性能调优全解析

本文系统梳理了Java并发编程的核心知识点,从并发问题的本质出发,深入剖析了Java内存模型、线程同步机制、锁优化策略等关键技术。主要内容包括:并发问题的根源(共享、竞争、时序)、JMM内存模型三大特性(原子性、可见性、有序性)、volatile和synchronized的使用场景与边界、ReentrantLock与AQS原理、线程池设计理念等。文章特别强调并发编程的工程实践价值,指出线上常见的偶发故障往往与并发控制不当有关,并提供了锁选择、线程池配置等实用建议。通过本文,开发者可以建立完整的并发知识体系,

百锦再的博客 2万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

并发编程已为程序员必备技能!终于知道室友为什么熬夜都要肝完这份阿里爆款神仙笔记了!

前言 一直以来,硬件的发展极其迅速,在多核的CPU的背景下,催生了并发编程的趋势,通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升。面对复杂业务模型,并行程序会比串行程序更适应业务需求,而并发编程更能吻合这种业务拆分。正是因为这些优点,使得多线程技术能够得到重视,这个技术也是一名CS学习者应该掌握的。 但这个技术对于刚入行的小白来说总是觉得高深莫测,不明所以,也找不到好的学习资料。本着好东西就是要拿出来分享的原则,于是乎互联网雷锋(小编我)就为大家收罗了一套完整的资料供大家学习,适用

weixin_50205273的博客 377

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

字节跳动内部首发笔记并发编程套餐!助我斩获七家大厂Offer

前言 一直以来,硬件的发展极其迅速,在多核的CPU的背景下,催生了并发编程的趋势,通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升。面对复杂业务模型,并行程序会比串行程序更适应业务需求,而并发编程更能吻合这种业务拆分。正是因为这些优点,使得多线程技术能够得到重视,这个技术也是一名CS学习者应该掌握的。 但这个技术对于刚入行的小白来说总是觉得高深莫测,不明所以,也找不到好的学习资料。本着好东西就是要拿出来分享的原则,于是乎互联网雷锋(小编我)就为大家收罗了一套完整的资料供大家学习,适用

小梦爱Java的博客 394

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

(一)线程是什么

多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。在单CPU计算机中,为了运行所有这些线程,操作系统需要为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程提供时间片,在宏观上似乎这些线程都在同时运行。简单的说,就是更好的利用CPU的资源。 1. 程序 计算机程序,是指为了得到某种结果而可以由计算机等具有信息处理能力的装置执行的代码化指令序列,或者可以被自动转换成代码化指令序列的符号化指令序列或者符号化语句序列。 2. 进程 为了使程序并发执行,并且可以对并发执行的程序加以描述和控制,人.

HaC 的博客 2077

Java面试题总结 - Java多线程篇(附答案)

Synchronized的并发策略是悲观的,不管是否产生竞争,任何数据的操作都必须加锁。乐观锁的核心是CAS,CAS包括内存值、预期值、新值,只有当内存值等于预期值时,才会将内存值修改为新值。1、锁消除所消除就是虚拟机根据一个对象是否真正存在同步情况,若不存在同步情况,则对该对象的访问无需经过加锁解锁的操作。比如StringBuffer的append方法,因为append方法需要判断对象是否被占用,而如果代码不存在锁竞争,那么这部分的性能消耗是无意义的。

2509_93956994的博客 1209

Java面试核心:HashMap、AQS与Spring事务深度解析

在Java技术面试中,HashMap的扩容机制、AQS(AbstractQueuedSynchronizer)的实现原理以及Spring事务的失效场景是高频考察点。HashMap作为Java集合框架的核心,其线程安全问题和负载因子设计直接关联到JUC并发工具的使用效率。AQS通过CLH队列和状态控制实现锁机制,是理解ReentrantLock和线程池等并发组件的基础。Spring事务则涉及代理机制和传播行为,其失效场景如内部方法调用或异常处理不当,是实际开发中的常见痛点。掌握这些原理不仅能应对技术面试,更能

weixin_30632883的博客 398

6.JUC并发工具类

限流:Semaphore可以用于限制对共享资源的并发访问数量,以控制系统的流量。资源池:Semaphore可以用于实现资源池,以维护一组有限的共享资源。并行任务同步:CountDownLatch可以用于协调多个并行任务的完成情况,确保所有任务都完成后再继续执行下一步操作。多任务汇总:CountDownLatch可以用于统计多个线程的完成情况,以确定所有线程都已完成工作。资源初始化:CountDownLatch可以用于等待资源的初始化完成,以便在资源初始化完成后开始使用。

初秋和的博客 259

ReentrantLock API

  java可重入锁,简单几个小案例,测试特性。   1.尝试锁 tryLock package com.cn.cfang.ReentrantLock; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks....

weixin_30628077的博客 257

java基础 - ReentrantLock

从结构上来看,AQS中有两个内部类,一个是Node结点类,一个是ConditionObject条件对象类,前者用来实现队列,后者用来做线程间通信。

软件测试入门笔记 3240
上一篇: 开发避坑指南(2):uni-app微信小程序开发‘createIndependentPlugin‘模块缺失问题分析与解决方案
下一篇: 开发避坑指南(3):解决@vitejs plugin-vue@5.0.5对Vite^5.0.0的依赖冲突
帧栈
博客等级 码龄2年 335粉丝 120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帧栈

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值