《黑马程序员》 读写锁的使用练习

------- android培训java培训、期待与您交流! ----------
/**
 * 读写锁 
 * 我们开启分别开启三个读的线程,分别开启三个写的线程
 *   读的时候其它的线程可以读,但是其它的线程不可以写
 *   写的时候其它的线程不可以写
 */
public class ReadWriteLockDemo {
	public static void main(String[] args) {
		final Queue3 q3=new Queue3();
		for(int i=1;i<=3;i++){
			new Thread(new Runnable() {
				
				@Override
				public void run() {
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					q3.read();  //读数据
				}
			}).start();
			
			new Thread(new Runnable(){
				public void run(){
					while(true){
						try {
							Thread.sleep(100);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
						q3.put(new Random().nextInt(10000));  //放的是10000以内的随机数
					}
				}
			}).start();  //不停的写数据
		}
			
	}
}

//读写锁示例代码
class Queue3{
	Object obj=null;  //所有的线程共享同一个对象。读的时候和写的时候都是使用的同一个对象
	//我们不可以使用普通的锁。因为这样一旦锁定了。读和写都进不去了。我们应该使用它的子类来实现
	private ReadWriteLock rw=new ReentrantReadWriteLock();  //这可是可重入的锁。它是显示的进行加锁和解锁
	public void read(){
		rw.readLock().lock();  //上读锁
		try {
			System.out.println(Thread.currentThread().getName()+"be ready to read data ");
			Thread.sleep((long)Math.random()*1000);
			System.out.println(Thread.currentThread().getName()+"have read data :"+obj);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}finally{
			//把读锁给释放掉
			rw.readLock().unlock(); 
		}
		//全部装在try里面是为了保证不管程序出现什么意外。锁一定会被释放掉
	}
	
	public void put(Object obj){
		rw.writeLock().lock();  //上写锁
		try {
			System.out.println(Thread.currentThread().getName()+"be ready to write data ");
			Thread.sleep((long)Math.random()*1000);
			this.obj=obj;  //给对象赋值
			System.out.println(Thread.currentThread().getName()+"have write data :"+obj);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}finally{
			rw.writeLock().unlock();  //把写锁给释放掉
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值