例子:
package com.example.demo.LockTest;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @program: Client
* @description: 自定义读写锁测试
* @author: wavesen.shen
* @create: 2019-06-17 09:09
*/
public class CustomizeReadWriteTest {
public static CustomizeReadWrite_2 crw=new CustomizeReadWrite_2();
public static void main(String[] args) throws InterruptedException {
for (int i=0; i<5; i++) {
new WriteThread("WriteThread:"+ " "+i+"-", i).start();
}
for (int i=0; i<15; i++) {
new ReadThread("ReadThread:" + " "+i+"-", i).start();
}
for (int i=5; i<8; i++) {
new WriteThread("WriteThread:"+ " "+i+"-", i).start();
}
for (int i=15; i<20; i++) {
new ReadThread("ReadThread:" + " "+i+"-", i).start();
}
}
static class ReadThread extends Thread{
private int num;
public ReadThread(String name, int num){
super(name);
this.num=num;
}
public void run(){
try{
crw.lockRead();
}catch (InterruptedException e){
e.printStackTrace();
}finally {
crw.unLockRead();
}
}
}
static class WriteThread extends Thread{
private int num;
public WriteThread(String name, int num){
super(name);
this.num=num;
}
public void run(){
try {
crw.lockWrite();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
crw.unLockWrite();
}
}
}
}
class CustomizeReadWrite_2 {
//读写锁分共享锁和互斥锁(排它锁、独占锁)
private volatile int readLockNum=0;
private volatile int writeLockNum=0;
private Lock lock=new ReentrantLock();
private Condition readwriteCondition=lock.newCondition();
public CustomizeReadWrite_2(){}
//读锁
public void lockRead() throws InterruptedException {
while(writeLockNum>0){//有写锁存在
lock.lock();
readwriteCondition.await();//进入等待状态
lock.unlock();
}
readLockNum++;//读锁+1
System.out.println(Thread.currentThread().getName()+": readLock+1, cunrrentreadNum:"+readLockNum+" cunrrentwriteNum: "+writeLockNum);
Thread.sleep(10000);
System.out.println(Thread.currentThread().getName()+" 执行结束");
}
//写锁
public void lockWrite() throws InterruptedException {
lock.lock();
try{
while(writeLockNum>0){//有写锁存在
readwriteCondition.await();
}
writeLockNum++;
while(readLockNum>0){//有读锁存在
readwriteCondition.await();
}
System.out.println(Thread.currentThread().getName()+": writeLock+1, cunrrentreadNum:"+readLockNum+" cunrrentwriteNum: "+writeLockNum);
Thread.sleep(1000);//模拟耗时
System.out.println(Thread.currentThread().getName()+" 执行结束");
}finally {
lock.unlock();
}
}
//释放读锁
public void unLockRead(){
readLockNum--;
if(readLockNum<=0){
lock.lock();
readwriteCondition.signalAll();
lock.unlock();
}
}
//释放写锁
public void unLockWrite(){
writeLockNum--;
if(writeLockNum<=0){
lock.lock();
readwriteCondition.signalAll();
lock.unlock();
}
}
}