`
raymond.chen
  • 浏览: 1436925 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

StampedLock的使用

 
阅读更多

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); //显示最新的变量值
		});
	}
}

 

分享到:
评论

相关推荐

    Java8新特性之StampedLock_动力节点Java学院整理

    Java 8 引入了一种新的同步...然而,使用`StampedLock`需要更多的代码来管理锁的生命周期,因此在编写时需要谨慎,以防止死锁和其他并发问题的发生。在选择锁机制时,开发者应根据具体的应用场景和性能需求权衡利弊。

    Java的两种读写锁介绍

    3. 如果需要更精细的锁控制,如获取锁的状态、转换锁类型,可以使用StampedLock。 总结,Java中的读写锁为并发编程提供了强大的工具,可以根据具体需求选择合适的锁类型。ReentrantReadWriteLock适合大多数情况,而...

    Java高并发实战_java高并发_高并发_

    第6章介绍了 Java 8中为并行计算做的新的改进, 包括并行流、 CompletableFuture、 StampedLock和LongAdder。第7章主要介绍了高并发框架Akka的基本使用方法,并使用Ak:ka框架实现了 个简单的粒子群算法, 模拟超高...

    Java并发编程原理与实战

    线程的状态以及各状态之间的转换详解.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); } ...

    Java互联网架构多线程并发编程原理及实战 视频教程 下载4.zip

    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...

    Java互联网架构多线程并发编程原理及实战 视频教程 下载2.zip

    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...

    Java互联网架构多线程并发编程原理及实战 视频教程 下载3.zip

    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...

    Java互联网架构多线程并发编程原理及实战 视频教程 下载.zip

    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...

    Java互联网架构多线程并发编程原理及实战 视频教程 下载1.zip

    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...

    leetcode分类-JavaStudy:Java学习

    StampedLock 的使用 CountDownLatch 和 CyclicBarrier 的使用 线程池的使用 (划重点) Future 和 FutureTask 的使用 CompletableFuture 的使用 (划重点) CompletableService 的使用 ForkJoin 的使用 应用 基于org....

    Java 高并发十: JDK8对并发的新支持详解

    以下是一个简单的使用示例:public class StampedLockExample { private volatile long value = 0; private StampedLock lock = new StampedLock(); public long readValue() { // 获取乐观读锁,返回stamp long ...

    龙果 java并发编程原理实战

    第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 并发编程原理与实战视频

    第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多线程面试120题.pdf

    7. **ReentrantReadWriteLock与StampedLock**:两者都是可重入的,但StampedLock提供更细粒度的锁,支持乐观读锁和写锁,比ReentrantReadWriteLock性能更高。在读多写少的场景下,StampedLock更优。 8. **阻塞队列*...

    龙果java并发编程完整视频

    第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并发编程

    第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...

    java8-new-features

    - **定义**:类型注解是Java 8中新增的一种注解,它可以应用在类型使用的位置,例如参数类型、返回类型等。 - **用途**:主要用于编译期的检查和工具支持,如用于IDE的智能提示、静态分析工具等。 - **示例**: ```...

Global site tag (gtag.js) - Google Analytics