`
huangyongxing310
  • 浏览: 495842 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Java 读写锁ReadWriteLock

    博客分类:
  • Java
阅读更多
Java 读写锁ReadWriteLock


读写锁相对于线程互斥的优势在于高效,它不会对两个读线程进行盲目的互斥处理,当读线程数量多于写线程尤其如此,当全是写线程时两者等效。(多用于读多写少时使用)


1.读锁可以允许多个进行读操作的线程同时进入,但不允许写进程进入。
2.写锁只允许一个写进程进入,在这期间任何进程都不能再进入。

注意:每个读写锁都有挂锁和解锁,最好将每一对挂锁和解锁操作都用try、finally来套入中间的代码,这样就会防止因异常的发生而造成死锁得情况。





例子:
import java.util.Random;
import java.util.concurrent.locks.*;

public class ReadWriteLockTest {
	public static void main(String[] args) {
		final TheData myData = new TheData(); // 这是各线程的共享数据
		for (int i = 0; i < 3; i++) { // 开启3个读线程
			new Thread(new Runnable() {
				@Override
				public void run() {
					while (true) {
						myData.get();
					}
				}
			}).start();
		}
		for (int i = 0; i < 3; i++) { // 开启3个写线程
			new Thread(new Runnable() {
				@Override
				public void run() {
					while (true) {
						myData.put(new Random().nextInt(10000));
					}
				}
			}).start();
		}
	}
}

class TheData {
	private Object data = null;
	private ReadWriteLock rwl = new ReentrantReadWriteLock();

	public void get() {
		rwl.readLock().lock(); // 读锁开启,读线程均可进入
		try { // 用try finally来防止因异常而造成的死锁
			System.out.println(Thread.currentThread().getName() + "is ready to read");
			Thread.sleep(new Random().nextInt(100));
			System.out.println(Thread.currentThread().getName() + "have read date" + data);
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			rwl.readLock().unlock(); // 读锁解锁
		}
	}

	public void put(Object data) {
		rwl.writeLock().lock(); // 写锁开启,这时只有一个写线程进入
		try {
			System.out.println(Thread.currentThread().getName() + "is ready to write");
			Thread.sleep(new Random().nextInt(100));
			this.data = data;
			System.out.println(Thread.currentThread().getName() + "have write date" + data);
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			rwl.writeLock().unlock(); // 写锁解锁
		}
	}
}



参考(ReentrantReadWriteLock类和ReentrantLock类的区别):http://blog.csdn.net/kai_wei_zhang/article/details/8197061

分享到:
评论

相关推荐

    java 读写锁代码

    下面我们将详细探讨Java读写锁的概念、实现原理以及如何在实际代码中应用。 1. **读写锁概念**: - 读写锁分为读锁(共享锁)和写锁(独占锁)。读锁允许多个线程同时读取数据,而写锁只允许一个线程进行写操作。 ...

    Java多线程编程之读写锁ReadWriteLock用法实例

    Java的多线程编程中,读写锁(ReadWriteLock)是一种高效的并发控制机制,它将锁的权限进行了区分,允许多个线程同时读取资源,但仅允许一个线程进行写入操作。这种设计模式提高了数据共享的效率,因为读操作通常...

    关于读写锁算法的Java实现及思考

    在Java中,`java.util.concurrent.locks`包下的`ReadWriteLock`接口提供了读写锁的抽象定义,具体实现由`ReentrantReadWriteLock`类提供。`ReentrantReadWriteLock`实现了`ReadWriteLock`接口,提供了`readLock()`和...

    Java编程读写锁详解

    在Java中,读写锁是通过ReadWriteLock接口实现的,该接口提供了readLock和writeLock两种锁的操作机制,一个资源可以被多个线程同时读,或者被一个线程写,但是不能同时存在读和写线程。 读写锁的基本规则是: * 读...

    Java并发编程之显示锁ReentrantLock和ReadWriteLock读写锁

    - **读写锁**: 除了ReentrantLock,Java还提供了ReadWriteLock接口,它包含两个Lock对象:一个用于读操作(ReadLock),允许多个线程同时读取共享资源;另一个用于写操作(WriteLock),一次只允许一个线程写入。...

    23 按需上锁—ReadWriteLock详解.pdf

    《Java并发编程学习宝典(漫画版)》中提到的23章主要讲解了Java并发编程中的一个重要概念——ReadWriteLock,即读写锁。ReadWriteLock是`java.util.concurrent.locks`包下的一个接口,它是对传统互斥锁的一个扩展,...

    多线程(22)读写锁分离模式1

    Java中提供了`java.util.concurrent.locks.ReadWriteLock`接口来支持这种模式,但在本案例中,我们将模拟实现一个读写锁来理解其基本原理。 1. **读写锁接口定义**: - `Lock`接口:这是基础的锁接口,提供了获取...

    java多线程-读写锁原理

    在Java多线程编程中,读写锁是一种高级的同步机制,它允许多个线程同时读取共享资源,但只允许一个线程写入。这种锁的引入提高了并发性能,特别是在读操作远多于写操作的场景下。Java 5开始,`java.util.concurrent....

    java并发工具包 java.util.concurrent中文版用户指南pdf

    java_util_concurrent_user_guide_cn.pdf 内容预览: ...21. 读写锁 ReadWriteLock 22. 原子性布尔 AtomicBoolean 23. 原子性整型 AtomicInteger 24. 原子性长整型 AtomicLong 25. 原子性引用型 AtomicReference

    8、读写锁ReentrantReadWriteLock&StampLock详解.pdf

    根据提供的文件信息,本文将详细解析读写锁`ReentrantReadWriteLock`以及`StampLock`在Java并发编程中的应用场景及其实现原理。 ### 一、读写锁介绍 #### 1.1 读写锁的基本概念 读写锁是一种特殊的锁机制,它可以...

    redisson实现分布式锁java源码

    redisson实现分布式锁java源码软件架构:SpringBoot2.3.12.RELEASE + Maven3.6.2 + JDK1.8 + Redis-x64-3.2.100 + ...源代码中包含读写锁ReadWriteLock、常规锁和red锁,可通过controller包进去分别阅读源码和调试

    java并发工具包详解

    1. java.util.concurrent - Java 并发工具包 ...21. 读写锁 ReadWriteLock 22. 原子性布尔 AtomicBoolean 23. 原子性整型 AtomicInteger 24. 原子性长整型 AtomicLong 25. 原子性引用型 AtomicReference

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版.pdf

    java_util_concurrent_user_guide_cn.pdf 内容预览: 1.... 读写锁 ReadWriteLock 22. 原子性布尔 AtomicBoolean 23. 原子性整型 AtomicInteger 24. 原子性长整型 AtomicLong 25. 原子性引用型 AtomicReferenc

    一个小的java Demo , 非常适合Java初学者学习阅读.rar

    使用 ForkJoinPool 进行分叉和合并,锁 Lock,读写锁 ReadWriteLock 原子性长整型 AtomicLong,原子性引用型 AtomicReference 修改数据: 一 服务端修改数据: 一 文章知识点与官方知识档案匹配,可进一步学习相关...

    Java锁的种类以及区别

    - `ReadWriteLock`接口定义了读写锁的行为,其具体实现类如`ReentrantReadWriteLock`。 ### 总结 Java中的锁机制对于保证多线程环境下的数据一致性至关重要。通过了解不同类型的锁及其特性,开发者可以根据实际...

    Java多线程之readwritelock读写分离的实现代码

    Java多线程之readwritelock读写分离的实现代码 Java多线程之readwritelock读写分离的实现代码主要介绍了Java多线程之readwritelock读写分离的相关内容,文中涉及具体实例代码,具有一定参考价值,需要的朋友可以...

    Java并发锁简介-动力节点共9页.pdf.zip

    3. **读写锁(ReadWriteLock)**:读写锁也是`java.util.concurrent.locks`的一部分,它为读操作和写操作提供不同的锁。读锁是共享的,允许多个线程同时读取数据;写锁是独占的,一次只有一个线程能写数据。这种设计...

    Java中的锁分类与使用.docx

    - **读写锁**(如ReadWriteLock)进一步细分为读锁和写锁,读锁可被多个线程共享,写锁是独占的,提高了读操作的并发性。 4. **可重入锁** - 可重入锁允许同一个线程多次获取同一把锁,例如Java的`synchronized`...

    提升Java的锁性能Java开发Java经验技巧共5页.p

    - **使用读写锁**:`ReadWriteLock`允许多个读取者同时访问,只有写入者时才会阻塞其他线程,提高并行性。 - **尝试使用乐观锁**:乐观锁假设冲突很少发生,只有在更新数据时检查是否被其他线程修改过,例如使用...

    java常用锁使用demo工程

    - **读写锁(ReadWriteLock)**:ReentrantReadWriteLock是Lock的一个实现,分为读锁(ReadLock)和写锁(WriteLock),允许多个读线程同时访问,但写锁是独占的。 - **条件变量(Condition)**:Lock接口提供了一...

Global site tag (gtag.js) - Google Analytics