public class ReadWriteLock {
public volatile Map<String,String> map = new HashMap<>();
ReentrantLock reentrantLock = new ReentrantLock();
ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
//独占锁
public void put(String key,String val){
reentrantLock.lock();
// readWriteLock.writeLock().lock();
try {
System.out.println(Thread.currentThread().getName()+"开始写入。。。");
Thread.sleep(500);
map.put(key,val);
System.out.println(Thread.currentThread().getName()+"写入完成。");
}catch (Exception e){
System.out.println(e);
}
finally {
reentrantLock.unlock();
// readWriteLock.writeLock().unlock();
}
}
public void get(String key){
// readWriteLock.readLock().lock();
try {
System.out.println(Thread.currentThread().getName()+"开始读取。。。");
Thread.sleep(300);
String result = map.get(key);
System.out.println(Thread.currentThread().getName()+"读取完毕:"+result);
}catch (Exception e){
System.out.println(e);
}
finally
{
// readWriteLock.readLock().unlock();
}
}
public static void main(String[] args) {
ReadWriteLock readWriteLock = new ReadWriteLock();
for (int i = 0; i < 5; i++) {
int finalI = i;
new Thread(()->{
readWriteLock.put(finalI +"", finalI +"");
}).start();
}
for (int i = 0; i < 5; i++) {
int finalI = i;
new Thread(()->{
readWriteLock.get(finalI +"");
}).start();
}
}
}
读写锁规则:
读-读共存
读-写不共存
写-写不共存
本例中与ReentranReadWriteLock区别
相同点:
都可以保证原子性。
不同点:
1、如果用ReetranLock只加锁put,会被get打断,不能保证写入的原子性。
2、如果用ReetrantLock加锁put和get,可以保证原子性,但读取只能单线程执行,效率变低。
3、ReentrantReanWriteLock可以保证读写锁规则。