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

ReentrantReadWriteLock 的例子

    博客分类:
  • lock
阅读更多
引用

两个线程  来改动 同一个 map里面的值, 在debug状态可以看到 , 只能同时一个线程 进行赋值, 因为有 writelock的 lock动作, 只有在一个lock 被unlock之后,才能另一线程 进入 进行修改。

同步阻塞





package com.base.concurrence.lock.reentrancereadwritelock;

public class ReentrancelockClient {
	static LockBody lb = new LockBody();
	
	public static void main(String[] args) {
		RunningTask rt1 = new RunningTask("FIRST", "RMB");
		RunningTask rt2 = new RunningTask("FIRST", "GBP");
		Thread t1 = new Thread(rt1);
		Thread t2 = new Thread(rt2);
		
		
		LockBody.Wallet wt_1 = new LockBody.Wallet();
		wt_1.currency = "JPY";
		
//		LockBody.Wallet wt_2 = new LockBody.Wallet();
//		wt_2.currency = "USD";
		
		lb.store("FIRST", wt_1);
		//lb.store("SECOND", wt_2);
		
		t1.start();
		t2.start();
		
		try {
			t1.join();
			t2.join();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		System.out.println(lb.getVal("FIRST").currency);
		//System.out.println(lb.getVal("SECOND").currency);
		
		
	}
	
	static class RunningTask implements Runnable{
		
		LockBody.Wallet newWt = new LockBody.Wallet();
		String keyPoint, newCurrency;
		
		public RunningTask(String key, String currency){
			keyPoint = key;
			newCurrency = currency;
		}
		
		@Override
		public void run() {
			lb.restore(keyPoint, newCurrency);
		}
		
	}
	
	
}







package com.base.concurrence.lock.reentrancereadwritelock;

import java.util.Map;
import java.util.TreeMap;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class LockBody {
	
	ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
	
	public static Map<String, Wallet> mp = new TreeMap<String, Wallet>();
	
	
	public void store(String key, Wallet wallet){
		lock.writeLock().lock();
		mp.put(key, wallet);
		lock.writeLock().unlock();
	}
	
	public Wallet getVal(String key){
		lock.readLock().lock();
		Wallet wt = mp.get(key);
		lock.readLock().unlock();
		return wt;
	}
	
	public void restore(String key, String currency){
		Wallet wallet = getVal(key);
		lock.writeLock().lock();
		wallet.currency = currency;
		lock.writeLock().unlock();
	}
	
	public static class Wallet{
		public String currency;
	}
}


分享到:
评论

相关推荐

    读写锁_读写锁_

    在这个例子中,`ReadWriteLockList`类维护了一个`LinkedList`,并使用`ReentrantReadWriteLock`来保护对链表的操作。添加和删除元素(写操作)都使用写锁,而读取元素(读操作)则使用读锁。这样,多个线程可以同时...

    readwritelock.zip

    在这个例子中,`read()`方法获取读锁,`write()`方法获取写锁。在读锁和写锁的`finally`块中,我们释放了相应的锁,确保即使在异常情况下也能正确释放锁。 ### 6. 优化与注意事项 - **公平性**:`...

    java中的各种锁详细介绍.docx

    此外,还有其他的锁机制,如读写锁(`ReentrantReadWriteLock`),它允许多个线程同时读取但只允许一个线程写入,进一步优化了读操作的并发性能。还有条件锁(如`Condition`),它可以实现更复杂的同步逻辑。 了解...

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

    在Java中,`java.util.concurrent.locks`包提供了`ReentrantReadWriteLock`类来实现可重入的读写锁。这个类包含两个核心方法:`readLock()`和`writeLock()`,分别用于获取读锁和写锁。读锁和写锁都是可重入的,这...

    多线程的批量线程同步解决方案

    Java的`ReentrantReadWriteLock`和C++的`std::shared_mutex`是典型的读写锁实现。 5. **屏障(Barrier)**:线程到达屏障后必须等待所有其他线程也到达才能继续执行。Java的`java.util.concurrent.CyclicBarrier`和...

    java多线程经典案例

    Java提供了多种同步机制,如synchronized关键字、Lock接口(ReentrantLock、ReentrantReadWriteLock)以及Semaphore信号量。synchronized用于方法或代码块,可以保证同一时间只有一个线程执行特定代码,避免数据冲突...

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

    在Java中,ReadWriteLock这个接口就为我们实现了这个需求,通过他的实现类ReentrantReadWriteLock我们可以很简单的来实现刚才的效果。ReadWriteLock接口提供了两个锁:读锁和写锁。读锁允许多个线程同时访问资源,而...

    java并发分享.ppt

    在Java中,`ReentrantReadWriteLock`提供了读写锁,其中读锁就是一种共享锁。 死锁是并发编程中的一个严重问题,它发生在多个线程互相等待对方释放资源而无法继续执行的情况。死锁的四个必要条件包括:互斥、不可...

    各种锁汇总,乐观锁、悲观锁、分布式锁、可重入锁、互斥锁、读写锁、分段锁、类锁、行级锁等

    Java的`ReentrantReadWriteLock`提供这种功能,提高并发性能。 7. **分段锁**:当数据结构很大时,如ConcurrentHashMap,采用分段锁策略,将大锁分解为多个小锁,从而提高并发性。每个小锁只保护一部分数据,减少了...

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

    - **例子**:在双重检查锁定(DCL)模式中,对象实例的构造过程必须保证不被重排序,以避免其他线程看到未完全初始化的对象。 **1.1.3 可见性** - **定义**:指当一个线程修改共享变量后,其他线程能够立即看到这...

    《Java Concurrency in Practice》代码示例

    - **Locks**:展示了如何使用内置的java.util.concurrent.locks包中的锁机制,如ReentrantLock、ReentrantReadWriteLock等。 - **Synchronized**:包含了使用`synchronized`关键字进行同步控制的示例,以及对监视...

    Java语言ReadWriteLock特性实例测试

    在这个例子中,我们创建了一个`Data`类,其中包含了`ReadWriteLock`的实例。`write()`方法获取写锁并在持有锁期间执行写操作,`read()`方法获取读锁并进行读操作。`main()`方法创建了三个线程,一个用于写操作,两个...

    HashMap源码分析系列-第四弹:HashMap多线程解决方案.docx

    ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); Map, String&gt; map = new HashMap(); public void put(String key, String value) { lock.writeLock().lock(); try { map.put(key, value); }...

    23 按需上锁—ReadWriteLock详解.pdf

    ReadWriteLock lock = new ReentrantReadWriteLock(); Lock readLock = lock.readLock(); Lock writeLock = lock.writeLock(); // 获取写锁 writeLock.lock(); System.out.println("got the write lock"); /...

    操作系统课程设计——读者写者问题

    在这个例子中,`reader()`方法获取读锁并执行读取操作,`writer()`方法首先获取读者信号量以确保没有读者,然后获取写锁进行写入操作。最后,无论读写操作结束,都要释放相应的锁和信号量。 在实际应用中,还需要...

    Barber shop

    6. **读写锁**:在某些情况下,可能需要使用`ReentrantReadWriteLock`来区分读取(多个顾客同时等待)和写入(理发师服务顾客)操作,以提高并发性能。 7. **死锁预防**:避免死锁的关键是遵循死锁预防的四个必要...

    Reader-Writer-Threading:java线程和信号量的读写器问题

    在这个例子中,Semaphore用于限制同时进行的读取操作,当达到最大数量时,其他试图读取的线程将被阻塞,直到当前读取者完成并释放许可。 总的来说,解决Java中的读写器问题通常需要结合使用线程同步机制,如...

    java哲学家就餐代码实例

    然而,实际的解决方案可能更复杂,需要考虑到更多的并发控制策略,例如使用信号量(Semaphore)或者读写锁(ReentrantReadWriteLock)。此外,还可以使用非阻塞的并发控制技术,如Java并发库中的`java.util....

    使用 Java8 实现观察者模式的方法(下)

    在这个例子中,`readLock`用于通知监听器,而`writeLock`用于修改监听器列表。通过这种方式,多个线程可以同时通知监听器,只有在添加或移除监听器时才会阻塞其他线程。 总的来说,Java8提供了多种工具和设计模式来...

    Java 信号量编程实践

    4. **读写锁优化**:结合ReentrantReadWriteLock,Semaphore可以用于优化读写锁,比如限制写操作的数量,而允许无限数量的读操作。 **四、示例代码** 下面是一个简单的Java Semaphore使用示例,模拟了一个只有两个...

Global site tag (gtag.js) - Google Analytics