月眸


ReentrantReadWriteLock使用例子

毛毛小妖 2019-06-22 150浏览 0条评论
首页/ 正文
分享到: / / / /

读写锁实现了对同一个资源边写边读的功能,以下代码可直接运行。

package com.demo.lock;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class TestLock {
	private static volatile Map<String,Object> map = new HashMap<String, Object>();
	private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
	
	/**
	 * 读取map的值,需要加写锁。写锁是独占锁,必须是原子性的操作
	 * @param key
	 * @param value
	 */
	public void put(String key,Object value){
		rwLock.writeLock().lock();
		try {
			System.out.println(Thread.currentThread().getName()+"正在写入:"+key);
			TimeUnit.MILLISECONDS.sleep(300);
			map.put(key, value);
			System.out.println(Thread.currentThread().getName()+"写入完成。");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}finally{
			rwLock.writeLock().unlock();
		}
	}
	
	/**
	 * 读取map的值,需要加读锁。读锁是共享锁
	 * @param key
	 */
	public void get(String key){
		rwLock.readLock().lock();
		try {
			System.out.println(Thread.currentThread().getName()+"正在读取");
			TimeUnit.MILLISECONDS.sleep(300);
			Object result = map.get(key);
			System.out.println(Thread.currentThread().getName()+"读取完成:"+result);
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			rwLock.readLock().unlock();
		}
	}
	
	public static void main(String[] args) {
		//要操作的共享资源
		TestLock TestLock = new TestLock();
		
		//五个线程同时写入值
		for(int i=0;i<5;i++){
			final int index = i;
			new Thread(()->{
				TestLock.put(index+"", index+"");
			},String.valueOf(index)).start();
		}
		
		//五个线程同时读取值
		for(int i=0;i<5;i++){
			final int index = i;
			new Thread(()->{
				TestLock.get(index+"");
			},String.valueOf(index)).start();
		}
		try {
			TimeUnit.SECONDS.sleep(3);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(map);
	}
}

 

最后修改:2019-06-22 17:36:56 © 著作权归作者所有
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

上一篇

发表评论

说点什么吧~

评论列表

还没有人评论哦~赶快抢占沙发吧~