当前位置: 首页 > news >正文

专业网站设计网站wordpress微商

专业网站设计网站,wordpress微商,北京营销型网站推广,设计产品码到三十五 #xff1a; 个人主页 心中有诗画#xff0c;指尖舞代码#xff0c;目光览世界#xff0c;步履越千山#xff0c;人间尽值得 ! 在现代多核处理器架构下#xff0c;并发编程成为提升程序性能的关键手段。Java作为一门广泛使用的编程语言#xff0c;提供了丰… 码到三十五 个人主页 心中有诗画指尖舞代码目光览世界步履越千山人间尽值得 ! 在现代多核处理器架构下并发编程成为提升程序性能的关键手段。Java作为一门广泛使用的编程语言提供了丰富的并发编程工具和库其中Java并发库JUC就是非常重要的一部分。在JUC中除了我们熟知的ReentrantLock、ReentrantReadWriteLock等锁机制外还有一个相对较新的锁机制——StampedLock。本文将深入解析StampedLock的工作原理、使用场景以及它相比其他锁机制的优势。 目录 一、StampedLock简介二、StampedLock的工作机制三、StampedLock的原理3.1 StampedLock核心3.2 源码分析 四、StampedLock的使用场景五、StampedLock的使用六、StampedLock与其他锁机制的比较总结 一、StampedLock简介 StampedLock是Java 8引入的一种新的锁机制它提供了乐观读锁和悲观读写锁的能力。与传统的ReentrantLock和ReentrantReadWriteLock相比StampedLock在并发性能上有了显著的提升。这是因为它支持一种称为“乐观读”的锁策略该策略允许多个线程同时读取共享资源而无需阻塞或等待其他线程的锁释放。 二、StampedLock的工作机制 StampedLock内部维护了一个状态变量用于表示锁的状态。这个状态变量不仅包含了锁的类型读锁或写锁还包含了一个版本号stamp。当线程尝试获取锁时StampedLock会根据锁的类型和当前状态来决定是否授予锁并返回一个相应的stamp值。线程在释放锁时需要传入之前获得的stamp值以确保锁的正确释放。 StampedLock提供了两种类型的读锁乐观读锁和悲观读锁。乐观读锁允许多个线程同时读取共享资源而无需阻塞或等待。这种锁策略适用于读多写少的场景可以显著提高并发性能。然而如果有一个线程正在修改共享资源那么乐观读锁可能会读取到不一致的数据。为了避免这种情况StampedLock还提供了悲观读锁它在读取共享资源时会阻塞其他写线程的访问。 StampedLock 是 Java 并发包 java.util.concurrent.locks 中的一个类它提供了乐观读、悲观读和写锁的机制。由于 StampedLock 的实现相对复杂这里我将简要概述其核心原理并提供一些关键部分的源码分析。请注意源码可能会随着 Java 版本的更新而有所变化以下分析基于 Java 8 及之后的版本。 三、StampedLock的原理 3.1 StampedLock核心 锁状态StampedLock 使用一个内部变量通常是一个 long 类型的变量来维护锁的状态。这个状态不仅表示锁是否被持有还包含了一个版本号stamp用于支持乐观读锁。 乐观读锁当线程尝试获取乐观读锁时StampedLock 会检查当前是否有写锁被持有。如果没有它会增加一个读锁计数器并返回一个 stamp通常是当前状态的一个快照。乐观读锁不会阻塞其他读线程或写线程但可能在写线程获得锁后读取到不一致的数据。 悲观读锁与乐观读锁不同悲观读锁会阻塞其他写线程的访问。当线程尝试获取悲观读锁时StampedLock 会检查是否有其他写线程持有锁或正在等待锁。如果没有它会授予锁并返回一个 stamp。 写锁写锁是独占的意味着同一时间只能有一个线程持有写锁。当线程尝试获取写锁时StampedLock 会检查是否有其他读锁或写锁被持有。如果有线程将被阻塞直到锁被释放。 可重入性StampedLock 支持锁的可重入性即一个线程可以多次获得同一个锁而不会导致死锁。这是通过跟踪每个线程的锁持有计数来实现的。 锁转换StampedLock 允许线程将乐观读锁转换为悲观读锁或写锁或将悲观读锁转换为写锁前提是在转换过程中没有其他线程获得相应的锁。 3.2 源码分析 由于 StampedLock 的源码较长且复杂这里只展示和分析一些关键部分。 锁状态变量 StampedLock 使用一个名为 state 的 long 类型变量来存储锁的状态。这个状态包含了锁的类型读锁、写锁和版本号等信息。 private final long WRITER_MASK 0x8000000000000000L; // 写锁标志位 private final long NOT_LOCKED 0L; // 锁未被持有的状态 private volatile long state; // 锁状态变量乐观读锁获取 当线程尝试获取乐观读锁时会调用 tryOptimisticRead 方法 public long tryOptimisticRead() {long s state; // 获取当前锁状态// 检查是否有写锁被持有通过检查最高位是否为1if ((s WRITER_MASK) ! 0L) {// 有写锁被持有返回0表示获取失败return 0L;} else {// 没有写锁被持有返回当前状态作为stamp乐观读锁不会改变锁状态return s;} }写锁获取 当线程尝试获取写锁时会调用类似 writeLock 或 tryWriteLock 的方法这些方法最终会调用一个内部方法来实现锁的获取逻辑。以下是一个简化的示例 private boolean acquireWrite(boolean interruptible, long deadline) {// 省略部分代码...long s state, next; // 当前状态和下一个状态// 循环尝试获取锁直到成功或超时或中断while (((s WRITER_MASK) ! 0L) || ((next tryIncWriter(s)) 0L)) {// 锁被其他线程持有根据interruptible和deadline决定等待或返回失败// 省略等待和中断处理逻辑...}// 成功获取写锁设置锁持有者信息线程和重入计数并返回true// 省略设置锁持有者信息和返回逻辑... }tryIncWriter 会尝试增加写锁计数器并返回新的状态。如果返回 0表示获取锁失败通常是因为锁已经被其他线程持有或状态已经改变。注意这里的循环和等待逻辑是为了处理并发访问和锁竞争的情况。 四、StampedLock的使用场景 StampedLock适用于读多写少、数据一致性要求不高的场景。例如在一个缓存系统中多个线程可能同时读取同一个缓存项而只有少数线程会修改缓存项。在这种情况下使用StampedLock的乐观读锁可以显著提高并发性能。然而如果数据一致性要求非常高或者写操作非常频繁那么可能需要考虑使用其他的锁机制如ReentrantLock或ReentrantReadWriteLock。 五、StampedLock的使用 下面的代码展示了如何使用乐观读锁、悲观读锁和写锁。注意下这只是一个基础示例用于说明各种锁的使用方式。 import java.util.concurrent.locks.StampedLock;public class StampedLockExample {// 创建一个 StampedLock 实例private final StampedLock stampedLock new StampedLock();// 共享资源private int balance 0;// 使用乐观读锁读取余额public int getBalanceWithOptimisticReadLock() {// 尝试获取乐观读锁long stamp stampedLock.tryOptimisticRead();// 读取余额int currentBalance balance;// 检查乐观读锁在读取过程中是否被无效比如被写锁干扰if (!stampedLock.validate(stamp)) {// 如果无效则使用悲观读锁重新读取stamp stampedLock.readLock();try {currentBalance balance;} finally {// 释放悲观读锁stampedLock.unlockRead(stamp);}}return currentBalance;}// 使用悲观读锁读取余额public int getBalanceWithPessimisticReadLock() {// 获取悲观读锁long stamp stampedLock.readLock();try {// 读取余额return balance;} finally {// 释放悲观读锁stampedLock.unlockRead(stamp);}}// 使用写锁更新余额public void updateBalanceWithWriteLock(int amount) {// 获取写锁long writeStamp stampedLock.writeLock();try {// 更新余额balance amount;} finally {// 释放写锁stampedLock.unlockWrite(writeStamp);}}public static void main(String[] args) {StampedLockExample example new StampedLockExample();// 模拟多线程环境下的读写操作Runnable readTask () - {int balance example.getBalanceWithOptimisticReadLock();System.out.println(读取到的余额乐观读锁: balance);};Runnable writeTask () - {example.updateBalanceWithWriteLock(100);System.out.println(更新了余额写锁, 新余额: example.getBalanceWithPessimisticReadLock());};// 启动多个读线程和写线程来模拟并发访问// 注意在实际应用中应该控制线程的数量和执行顺序以避免过度竞争和潜在的死锁风险。// 这里为了简化示例并没有使用线程池或同步工具来控制线程的启动和终止。new Thread(readTask).start();new Thread(readTask).start();new Thread(writeTask).start();// ... 可以继续启动更多线程进行测试} }在上面的代码中我们有一个 balance 变量作为共享资源。我们定义了三个方法 getBalanceWithOptimisticReadLock使用乐观读锁尝试读取余额。如果在读取过程中乐观读锁被写锁干扰而失效它将回退到使用悲观读锁重新读取余额。 getBalanceWithPessimisticReadLock使用悲观读锁读取余额。这将阻止其他写线程在此期间修改余额但允许多个读线程同时读取。 updateBalanceWithWriteLock使用写锁更新余额。这将独占访问共享资源确保在更新期间没有其他线程能够读取或写入余额。 在 main 方法中我们创建了一个 StampedLockExample 实例并定义了读任务和写任务来模拟多线程环境下的读写操作。然后我们启动多个线程来执行这些任务。 六、StampedLock与其他锁机制的比较 与传统的ReentrantLock和ReentrantReadWriteLock相比StampedLock在并发性能上有了显著的提升。这是因为它采用了乐观读锁的策略允许多个线程同时读取共享资源。 此外StampedLock还支持可重入锁和公平锁的特性提供了更灵活的锁控制选项。 然而StampedLock的使用也相对复杂一些需要开发者对锁的状态和版本号进行精细的控制和管理。 总结 StampedLock是Java并发库JUC中一种高效、灵活的锁机制。它提供了乐观读锁和悲观读写锁的能力适用于读多写少、数据一致性要求不高的场景。与传统的ReentrantLock和ReentrantReadWriteLock相比StampedLock在并发性能上有了显著的提升。然而它的使用也相对复杂一些需要开发者对锁的状态和版本号进行精细的控制和管理。在实际应用中开发者应根据具体的场景和需求选择合适的锁机制来确保程序的正确性和性能。 术因分享而日新每获新知喜溢心扉。 诚邀关注公众号 『 码到三十五 』 获取更多技术资料。
http://www.w-s-a.com/news/533647/

相关文章:

  • 宜春网站建设推广网络推广工作好干吗
  • 网站程序0day平顶山市做网站
  • 企业网站名称怎么写哔哩哔哩网页版官网在线观看
  • 直播网站建设书籍阿里巴巴网站建设销售
  • 肇庆企业自助建站系统郴州网站建设解决方案
  • 长沙专业做网站排名游戏开发大亨内购破解版
  • 网站推广适合女生做吗网站如何开启gzip压缩
  • 做外单阿里的网站建站平台那个好
  • 全国性质的网站开发公司关于网站开发的请示
  • 齐齐哈尔住房和城乡建设局网站生物科技公司网站模板
  • 中国建设协会官方网站前端培训的机构
  • 网站建设套餐是什么北京孤儿院做义工网站
  • 网站如何做微信支付链接做暧小视频xo免费网站
  • SEO案例网站建设重庆建站模板平台
  • 上海seo网站推广公司wordpress 小米商城主题
  • 搭建服务器做网站什么网站可以请人做软件
  • 上海建筑建材业网站迁移公家网站模板
  • 仿制别人的网站违法吗网站防火墙怎么做
  • 杨浦网站建设 网站外包公司如何进行网络推广
  • wordpress+仿站步骤超详细wordpress常用函数
  • 浙江手机版建站系统哪个好怎样黑进别人的网站
  • 企业网站搜索引擎推广方法装修网络公司
  • 网站运营优化建议wordpress 添加媒体
  • 用asp.net做网站计数器施工企业会计的内涵
  • 网站被黑咋样的网站建设 设计业务范围
  • 网站开发学哪种语言网站编辑器失效
  • WordPress插件提示信息江阴网站优化
  • 网站开发用的软件如何做网站内容管理
  • 扬州网站建设公司网站推广是什么岗位
  • 双线网站管理咨询公司是做什么