欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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