StampedLock是Java8引入的一种新的锁机制,是对读写锁ReentrantReadWriteLock的增强。该锁提供了三种模式的读写控制,分别为 writeLock 排他锁、readLock 悲观读锁、tryOptimisticRead 乐观读锁。
相比ReentrantReadWriteLock,StampedLock通过提供乐观读锁在读线程多写线程少的情况下提供更好的性能,因为乐观读锁不需要进行CAS设置锁的状态而只是简单的测试状态。
StampedLock的内部实现是基于CLH锁的,CLH锁是一种自旋锁,它保证没有饥饿的发生,并且可以保证FIFO(先进先出)的服务顺序。
CLH锁的基本思想如下:锁维护一个等待线程队列,所有申请锁,但是没有成功的线程都记录在这个队列中,每一个节点代表一个线程,保存一个标记位(locked),用于判断当前线程是否已经释放锁,locked=true 表示获取到锁,false 表示成功释放了锁。
当一个线程试图获得锁时,取得等待队列的尾部节点作为其前序节点,并使用类似如下代码判断前序节点是否已经成功释放锁:while (pred.locked) { ... }
只要前序节点(pred)没有释放锁,则表示当前线程还不能继续执行,因此会自旋等待;反之,如果前序线程已经释放锁,则当前线程可以继续执行。
释放锁时,也遵循这个逻辑,线程会将自身节点的locked位置标记位false,那么后续等待的线程就能继续执行了。
private static void writeLock(int threadCount){ for(int i=0; i<threadCount; i++){ service.submit(() -> { long stamp = lock.writeLock(); //获取排他写锁 try{ TimeUnit.MILLISECONDS.sleep(milli); ++count; System.out.println("\t" + count); }catch(Exception ex){ ex.printStackTrace(); }finally{ lock.unlockWrite(stamp); //释放写锁 } }); } } private static void readLock(int threadCount){ for(int i=0; i<threadCount; i++){ service.submit(() -> { int currentCount = 0; long stamp = lock.readLock(); //获取排他读锁 try { currentCount = count; //获取变量值 } finally { lock.unlockRead(stamp); //释放读锁 } System.out.println(currentCount); //显示最新的变量值 }); } } private static void optimisticRead(int threadCount){ for(int i=0; i<threadCount; i++){ service.submit(() -> { long stamp = lock.tryOptimisticRead(); //尝试获取乐观读锁 int currentCount = count; //获取变量值 if(!lock.validate(stamp)){ //有写锁修改变量值 stamp = lock.readLock(); //获取排他读锁 try { currentCount = count; //重新获取最新的变量值 } finally { lock.unlockRead(stamp); //释放读锁 } } System.out.println(currentCount); //显示最新的变量值 }); } }
相关推荐
Java 8 引入了一种新的同步...然而,使用`StampedLock`需要更多的代码来管理锁的生命周期,因此在编写时需要谨慎,以防止死锁和其他并发问题的发生。在选择锁机制时,开发者应根据具体的应用场景和性能需求权衡利弊。
3. 如果需要更精细的锁控制,如获取锁的状态、转换锁类型,可以使用StampedLock。 总结,Java中的读写锁为并发编程提供了强大的工具,可以根据具体需求选择合适的锁类型。ReentrantReadWriteLock适合大多数情况,而...
第6章介绍了 Java 8中为并行计算做的新的改进, 包括并行流、 CompletableFuture、 StampedLock和LongAdder。第7章主要介绍了高并发框架Akka的基本使用方法,并使用Ak:ka框架实现了 个简单的粒子群算法, 模拟超高...
线程的状态以及各状态之间的转换详解.mp4 ...JDK8新增锁StampedLock详解.mp4 重排序问题.mp4 happens-before简单概述.mp4 锁的内存语义.mp4 volatile内存语义.mp4 final域的内存语义.mp4 实战:问题定位.mp4
基本语法:使用StampedLock时,获取悲观读锁和写锁会返回一个long类型的stamp,释放锁时需要传入这个stamp值。例如: ```java long stamp = lock.readLock(); try { // 读操作 } finally { lock.unlock(stamp); } ...
4-13 StampedLock原理及使用.mp4 5-1 wait、notify、notifyAll.mp4 5-2 等待通知经典模型之生产者消费者.mp4 5-3 使用管道流进行通信.mp4 5-4 Thread.join通信及其源码浅析.mp4 5-5 ThreadLocal的使用.mp4 5-6...
4-13 StampedLock原理及使用.mp4 5-1 wait、notify、notifyAll.mp4 5-2 等待通知经典模型之生产者消费者.mp4 5-3 使用管道流进行通信.mp4 5-4 Thread.join通信及其源码浅析.mp4 5-5 ThreadLocal的使用.mp4 5-6...
4-13 StampedLock原理及使用.mp4 5-1 wait、notify、notifyAll.mp4 5-2 等待通知经典模型之生产者消费者.mp4 5-3 使用管道流进行通信.mp4 5-4 Thread.join通信及其源码浅析.mp4 5-5 ThreadLocal的使用.mp4 5-6...
4-13 StampedLock原理及使用.mp4 5-1 wait、notify、notifyAll.mp4 5-2 等待通知经典模型之生产者消费者.mp4 5-3 使用管道流进行通信.mp4 5-4 Thread.join通信及其源码浅析.mp4 5-5 ThreadLocal的使用.mp4 5-6...
4-13 StampedLock原理及使用.mp4 5-1 wait、notify、notifyAll.mp4 5-2 等待通知经典模型之生产者消费者.mp4 5-3 使用管道流进行通信.mp4 5-4 Thread.join通信及其源码浅析.mp4 5-5 ThreadLocal的使用.mp4 5-6...
StampedLock 的使用 CountDownLatch 和 CyclicBarrier 的使用 线程池的使用 (划重点) Future 和 FutureTask 的使用 CompletableFuture 的使用 (划重点) CompletableService 的使用 ForkJoin 的使用 应用 基于org....
以下是一个简单的使用示例:public class StampedLockExample { private volatile long value = 0; private StampedLock lock = new StampedLock(); public long readValue() { // 获取乐观读锁,返回stamp long ...
第57节JDK8新增锁StampedLock详解00:29:37分钟 | 第58节重排序问题00:23:19分钟 | 第59节happens-before简单概述00:15:17分钟 | 第60节锁的内存语义00:13:54分钟 | 第61节volatile内存语义00:12:04分钟 | 第62...
第57节JDK8新增锁StampedLock详解00:29:37分钟 | 第58节重排序问题00:23:19分钟 | 第59节happens-before简单概述00:15:17分钟 | 第60节锁的内存语义00:13:54分钟 | 第61节volatile内存语义00:12:04分钟 | 第62...
7. **ReentrantReadWriteLock与StampedLock**:两者都是可重入的,但StampedLock提供更细粒度的锁,支持乐观读锁和写锁,比ReentrantReadWriteLock性能更高。在读多写少的场景下,StampedLock更优。 8. **阻塞队列*...
第57节JDK8新增锁StampedLock详解00:29:37分钟 | 第58节重排序问题00:23:19分钟 | 第59节happens-before简单概述00:15:17分钟 | 第60节锁的内存语义00:13:54分钟 | 第61节volatile内存语义00:12:04分钟 | 第62...
第57节JDK8新增锁StampedLock详解00:29:37分钟 | 第58节重排序问题00:23:19分钟 | 第59节happens-before简单概述00:15:17分钟 | 第60节锁的内存语义00:13:54分钟 | 第61节volatile内存语义00:12:04分钟 | 第62...
- **定义**:类型注解是Java 8中新增的一种注解,它可以应用在类型使用的位置,例如参数类型、返回类型等。 - **用途**:主要用于编译期的检查和工具支持,如用于IDE的智能提示、静态分析工具等。 - **示例**: ```...