ReenTrantReadWriterLock
ReenTrantReadWriterLock是基于ReadWriteLock的实现类;
于获取读写锁的。两个方法:写锁:readLock();读锁:writeLock();
对于ReeTrantReadWriterLock:
- 读读共享
- 读写互斥
- 写写互斥。
下面基于ReenTrantReadWriteLock简单验证一下
package com.demo.udpdemo.reentrantReadWriteLockDemo;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* ReeTrantReadWriterLock 是ReadWriteLock的实现类;用于获取读写锁的。两个方法:写锁:readLock();读锁:writeLock();
* 对于ReeTrantReadWriterLock,读读共享。读写互斥,写写互斥。
*
* @author yugan
*/
public class ReeTrantReadWriterLockTest {
static ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();
/**
* 获取读锁
*/
static ReentrantReadWriteLock.ReadLock readLock = reentrantReadWriteLock.readLock();
/**
* 获取写锁
*/
static ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock();
/**
* 读操作
*/
public static void read() {
String threadName = Thread.currentThread().getName();
try {
readLock.lock();
System.out.println("线程:" + threadName + "获取到read锁");
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("线程:"+threadName+"释放read锁");
readLock.unlock();
}
}
static void write(){
String threadName = Thread.currentThread().getName();
try {
writeLock.lock();
System.out.println("线程:" + threadName + "获取到write锁");
Thread.sleep(1000);
}catch (Exception e){
e.printStackTrace();
}finally {
System.out.println("线程:" + threadName + "释放write锁");
writeLock.unlock();
}
}
}
第一组:读读共享
public static void main(String[] args) {
new Thread(()->read()).start();
new Thread(()->read()).start();
// new Thread(()->write()).start();
// new Thread(()->write()).start();
}
从结果可以看到:线程0和线程1同时获取到read锁:
第二组:写写互斥
public static void main(String[] args) {
// new Thread(()->read()).start();
// new Thread(()->read()).start();
new Thread(()->write()).start();
new Thread(()->write()).start();
}
从结果看到:线程1先获取到write锁以后,线程0得等线程1释放锁以后才能获取到write锁:说明写写互斥
第三组:读写 互斥
public static void main(String[] args) {
new Thread(()->read()).start();
// new Thread(()->read()).start();
new Thread(()->write()).start();
// new Thread(()->write()).start();
}
从结果看到:线程0获取到read锁,线程1要想获取到write锁得先等线程0释放read锁以后才能获取到