关于读写锁
写的时候其他线程不能进来,只能等待线程写完。读的时候其他线程可以读取,但是加了个读锁保证连续读逻辑上的一致性。
资料来源:
https://www.liaoxuefeng.com/wiki/1252599548343744/1306581002092578#0
import java.util.concurrent.locks.*;
public class DemoReadWriteLock {
public static void main(String[] args) {
var counter=new Counter();
for (int i = 0; i <10 ; i++) {
var writeThread=new Thread("write"+i){
@Override
public void run() {
// System.out.println("当前的线程是:"+Thread.currentThread().getName());
int xcount=(int)(Math.random()*10);
int ycount=(int)(Math.random()*10);
int []aa=new int []{xcount,ycount};
try {
counter.writeCount(aa);
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
// System.out.println("当前的线程是:"+Thread.currentThread().getName()+" 读取的count是:"+count);
}
};
writeThread.start();
}
for (int i = 0; i <10 ; i++) {
var readThread=new Thread("read"+i){
@Override
public void run() {
//System.out.println("当前的线程是:"+Thread.currentThread().getName());
int[] count= new int[0];
try {
count = counter.readCount();
System.out.println("1最终读到的线程"+Thread.currentThread().getName()+"xcount:"+count[0]+",ycount:"+count[1]);
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("2最终读到的线程:"+Thread.currentThread().getName()+" 读取的xcount:"+count[0]+",ycount:"+count[1]);
}
};
readThread.start();
}
}
}
class Counter {
private ReadWriteLock lockObj= new ReentrantReadWriteLock();
private Lock writeLock=lockObj.writeLock();
private Lock readLock=lockObj.readLock();
private int[] obj;
// public int[] readCount() throws InterruptedException {
// readLock.lock();
// System.out.println("获得读锁,读线程-name:"+Thread.currentThread().getName()+"-刚开始进来前的数值是(obj[0]:"+obj[0]+",obj[1]:"+obj[1]+")");
// String name="我多加了一次赋值看看"+Thread.currentThread().getName();
// name+="~二次赋值看看"+Thread.currentThread().getName();
// name+="~三次赋值看看"+Thread.currentThread().getName();
// int x=obj[0];
// int y=obj[1];
// System.out.println("获得读锁,读线程-name:"+Thread.currentThread().getName()+"(obj[0]:"+obj[0]+",obj[1]:"+obj[1]+")"+"-"+name);
// try{
// return obj;
// }
// finally {
// readLock.unlock();
// }
//
// }
public int[] readCount() throws InterruptedException {
System.out.println("无锁,读线程-name:"+Thread.currentThread().getName()+"-刚开始进来前的数值是(obj[0]:"+obj[0]+",obj[1]:"+obj[1]+")");
String name="我多加了一次赋值看看"+Thread.currentThread().getName();
name+="~二次赋值看看"+Thread.currentThread().getName();
name+="~三次赋值看看"+Thread.currentThread().getName();
int x=obj[0];
int y=obj[1];
System.out.println("无锁,读线程-name:"+Thread.currentThread().getName()+"(obj[0]:"+obj[0]+",obj[1]:"+obj[1]+")"+"-"+name);
return obj;
}
public void writeCount(int[]a) throws InterruptedException {
writeLock.lock();
this.obj=a;
System.out.println("获得写锁,写线程后:"+Thread.currentThread().getName()+"obj[0]:"+a[0]+",obj[1]:"+a[1]);
writeLock.unlock();
}
}
有加读锁:
没加锁的执行过程: