Thread学习(六)读写锁的学习ReadWriterLock学习

Thread中读写锁

读写锁,分为读锁和写锁,多个读锁不互斥,读锁和写锁互斥,写锁和写锁互斥,其实很好理解,就是读的时候不能多线程去写,读的时候可以多线程去读,写的时候不能多线程去写。这是由jvm自己控制的,你只要上相应的锁就行了,如果你的代码是只读数据,可以很多人去读,但不能同时写,那就上读锁,如果你的代码修改数据,那就上写锁,只能有一个人在写,不能有人在写得时候读数据。
下面我们来看一个关于读写锁的例子
public class ReadWriterLockTest {
	
	public static void main(String[] args) {
		ReadWriteMethod rwm = new ReadWriteMethod();
		for(int i=1;i<=3;i++){
			new Thread(new Runnable() {//写线程
				@Override
				public void run() {
					rwm.setData(new Random().nextInt(10000));
				}
			},"t2").start();
			
			new Thread(new Runnable() { //读线程
				@Override
				public void run() {
					rwm.getData();
				}
			},"t1").start();
			
		}
	}
	
	static class ReadWriteMethod{
		private Object data = null;
		public void getData(){
			try {	
				System.out.println("准备读取数据");
				Thread.sleep(1000);
				System.out.println("读取到数据为---------"+data);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}finally {
			}
			
		}
		
		public void setData(Object data){
			try {
				System.out.println("准备写入数据");
				Thread.sleep(500);
				this.data = data;
				System.out.println("写入的数据为---------"+data);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally {
			}
			
		}
	}
}
上面这个例子我们就来模拟读取数据和对map写入数据,运行上面的代码

我们发现当我们准备写入数据的时候,读取数据的线程也同时在执行。那么这样是不可以的,
下面我们把上面的程序改造一下
public class ReadWriterLockTest {
	
	public static void main(String[] args) {
		ReadWriteMethod rwm = new ReadWriteMethod();
		for(int i=1;i<=3;i++){
			new Thread(new Runnable() {//写线程
				@Override
				public void run() {
					rwm.setData(new Random().nextInt(10000));
				}
			},"t2").start();
			
			new Thread(new Runnable() { //读线程
				@Override
				public void run() {
					rwm.getData();
				}
			},"t1").start();
			
		}
	}
	
	static class ReadWriteMethod{
		private Object data = null;
		ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
		public void getData(){
			readWriteLock.readLock().lock();
			try {	
				System.out.println("准备读取数据");
				Thread.sleep(1000);
				System.out.println("读取到数据为---------"+data);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}finally {
				readWriteLock.readLock().unlock();
			}
			
		}
		
		public void setData(Object data){
			readWriteLock.writeLock().lock();
			try {
				System.out.println("准备写入数据");
				Thread.sleep(500);
				this.data = data;
				System.out.println("写入的数据为---------"+data);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally {
				readWriteLock.writeLock().unlock();
			}
			
		}
	}
}


此时我们发现读取数据是交替进行的,两个线程可以同时读,但是不能读的时候去写,也不能出现写的时候去写!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值