`

使用readLock与writeLock实现缓存

    博客分类:
  • J2SE
阅读更多

锁妙用:

读写锁:分为读锁和写锁,多个读锁不能互斥,读锁与写锁互斥,写锁与写锁互斥,这是由JVM自己控制的,只要上好相应的锁即可,如果你的代码只读数据,可以多人同时读,但不能同时写,那就上读锁;如果要修改数据,只能有一个人在写,且不能同时读取,那就上写锁,总之,读的时候上读锁,写的时候上写锁.

如使用readLock与writeLock实现缓存

public class CacheDemo {
	private Map<String, Object> cache = new HashMap<String, Object>();
	private ReadWriteLock rwl = new ReentrantReadWriteLock();
	
	public  Object getData(String key){
		rwl.readLock().lock();
		Object value = null;
		try{
			value = cache.get(key);
			if(value == null){
				rwl.readLock().unlock();
				rwl.writeLock().lock();
				try{
					if(value==null){
						value = "aaaa";// queryDB();
					}
				}finally{
					rwl.writeLock().unlock();
				}
				rwl.readLock().lock();
			}
		}finally{
			rwl.readLock().unlock();
		}
		return value;
	}
	
}
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    23 按需上锁—ReadWriteLock详解.pdf

    使用ReadWriteLock与使用Lock接口的基本流程相似,需要分别获取读锁和写锁。以下是一个简单的例子: ```java public class Client { public static void main(String[] args) throws InterruptedException { ...

    java多线程安全性基础介绍.pptx

    ReentrantReadWriteLock.ReadLock ReentrantReadWriteLock.WriteLock 隐式锁(内置锁) Synchronized 问题 死锁 性能 线程活跃与线程饥饿 同步工具类 原子操作类 AtomicInteger等 相当于加上...

    并发编程面试专题.pdf

    例如,实现一个允许多读一写的缓存,可以使用`ReentrantReadWriteLock`: ```java ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); ... lock.readLock().lock(); // 读操作 try { // 读取操作 ...

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

    private Lock r = readWriteLock.readLock(); private Lock w = readWriteLock.writeLock(); // 读操作 public Data get(String key) { r.lock(); try { // 业务逻辑 } finally { r.unlock(); } } // 写操作...

    2011年九月腾讯,创新工场,淘宝等公司最新面试三十题

    lock.readLock().unlock(); } } } ``` #### 2. 寻找二叉树中两个节点的最近公共祖先 **知识点概述:** 对于一个包含一亿节点的树,寻找两个给定节点的最近公共祖先。 **详细解析:** 寻找二叉树中两个节点的...

    homework-ReadWriteLock-KristampsW-main.zip

    例如,`readLock()`返回的`Sync`子类`NonReentrantReadLock`实现了读锁的逻辑,而`writeLock()`返回的`Sync`子类`NonReentrantWriteLock`实现了写锁的逻辑。 - `acquireShared`和`releaseShared`方法中包含了读锁的...

    readwritelock.zip

    `ReentrantReadWriteLock`由两部分组成:`ReadLock`和`WriteLock`。每个部分都是一个独立的锁,可以被单独获取和释放。 - **ReadLock**:多个线程可以同时持有读锁,实现读操作的并发。只要没有线程持有写锁,就...

    并发编程面试专题1

    具体实现时,可以创建一个`ReadWriteLock`实例,读操作使用`readLock()`,写操作使用`writeLock()`。这样,多个读操作可以并发进行,而写操作会阻塞所有其他读写操作,直到写操作完成。 2. **Lock接口的优势** ...

    15个顶级Java多线程面试题答案

    使用`Thread.join()`方法可以轻松地实现线程间的顺序执行,而`Lock`接口则提供了更高级别的锁控制机制,尤其是对于需要更复杂锁定逻辑的应用场景,如实现高效缓存时,`ReadWriteLock`提供了很好的解决方案。...

    15个顶级Java多线程面试题及回答.docx

    lock.readLock().unlock(); } } public void put(K key, V value) { lock.writeLock().lock(); try { cache.put(key, value); } finally { lock.writeLock().unlock(); } } } ``` #### 题目三:`wait()...

    wxh MutexRW.zip

    `Mutex`类通常会有`lock()`、`unlock()`方法,而`ReadWriteLock`类会有`readLock()`、`writeLock()`等方法供线程获取读锁或写锁。使用这些类,开发者可以方便地在代码中实现多线程环境下的资源共享和同步。 在实际...

    深入浅出ReentrantReadWriteLock源码解析.docx

    其中,`readLock()`和`writeLock()`方法分别用于获取读锁和写锁,它们使用CAS操作来保证线程安全。在读锁的实现中,ReentrantReadWriteLock支持读锁的重入,而写锁同样支持重入,但写锁具有更高的优先级,即使有多个...

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

    - `ReadLock`和`WriteLock`类:这两个内部类分别代表读锁和写锁,它们实现了`Lock`接口。在实际操作中,这两个类会根据读写锁的规则来控制对共享资源的访问。 3. **读写锁工作原理**: - **读锁(共享锁)**:...

    java多线程学习笔记02(csdn)————程序.pdf

    在Java的`java.util.concurrent.locks`包中,除了ReentrantLock,还有其他类型的锁,如ReadWriteLock(读写锁),它包含WriteLock和ReadLock两个部分,分别控制写操作和读操作。这样,多个读线程可以同时访问资源,...

    Java的两种读写锁介绍

    - `readLock()`: 获取读锁。 - `writeLock()`: 获取写锁。 - `tryReadLock()`, `tryWriteLock()`: 尝试获取读写锁,不会阻塞。 - `unlock()`: 释放锁。 二、StampedLock(标记锁) 1. **简介**: StampedLock...

    计算机软件-商业源码-利用读写锁保持线程同步.zip

    Java的`ReentrantReadWriteLock`提供了可重入的读写锁功能,包括`ReadLock`和`WriteLock`接口,它们分别用于读取和写入操作。开发者可以通过调用`lock()`和`unlock()`方法来获取和释放锁。 6. **C++中的std::...

    多线程面试题及处理方案和详解

    - **readLock()**:获取读锁。 - **writeLock()**:获取写锁。 - **unlock()**:释放锁。 #### 四、线程池源码分析 - **核心组件**: - **ExecutorService**:提供了一个高级接口来创建和管理线程。 - **...

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

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

Global site tag (gtag.js) - Google Analytics