读写锁实现了对同一个资源边写边读的功能,以下代码可直接运行。
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
© 著作权归作者所有
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付
