Java并发线程编程基础(3)-ReadWriteLock读写锁
程序员文章站
2022-07-12 11:30:41
...
ReadWriteLock读写锁
ReadWriteLock分为读锁和写锁:
如果代码只读数据,可允许多线程同时读但不可以同时写就上读锁,
如果代码只写数据,只能由一个线程写且不允许读就上写锁。
总之:读数据上读锁,写数据就上写锁。
public class TestDemo {
public static void main(String[] args) {
final Test test = new Test();
for(int i=0;i<3;i++){
new Thread(new Runnable() {
@Override
public void run() {
test.write("ABCDEFG");
}
},"线程一").start();
new Thread(new Runnable() {
@Override
public void run() {
test.get();
}
},"线程二").start(); //开启二个线程,Thread的第二个参数是设置线程名,默认线程名是Thread-i,i>=0;
}
}
}
class Test{
private Object data = null; //共享数据
ReentrantReadWriteLock rwlock = new ReentrantReadWriteLock(); //创建读写锁对象
public void write(Object data) {
rwlock.writeLock().lock(); //上写锁
System.out.println(Thread.currentThread().getName()+" 正在写入数据 "+data);
try {
Thread.sleep((long)(Math.random()*1000)); //模拟等待时间
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
this.data = data;
System.out.println(Thread.currentThread().getName()+"已写入数据");
rwlock.writeLock().unlock(); //解写锁
}
}
public void get(){
rwlock.readLock().lock(); //上读锁
System.out.println(Thread.currentThread().getName()+"准备读取数据");
try {
Thread.sleep((long)(Math.random()*1000)); //模拟等待时间
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
System.out.println(Thread.currentThread().getName()+" 读取数据 "+data);
rwlock.readLock().unlock(); //解读锁
}
}
}
打印结果,很容易看出可以多线程同时读,但只可以一个线程写:
线程一 正在写入数据 ABCDEFG
线程一已写入数据
线程二准备读取数据
线程二 读取数据 ABCDEFG
线程一 正在写入数据 ABCDEFG
线程一已写入数据
线程一 正在写入数据 ABCDEFG
线程一已写入数据
线程二准备读取数据
线程二准备读取数据
线程二 读取数据 ABCDEFG
线程二 读取数据 ABCDEFG