JAVA:多线程的读写锁的完成

今天写课设项目的时候,在搭建后端的时候需要有一个读写锁,大概实现的功能:

在访问互斥资源的时候,当读互斥资源时,如果没有线程写互斥资源,并且没有线程等待去写互斥资源时,那么就允许所有的读线程进入。当写互斥资源时,如果存在读互斥资源的线程或者写互斥资源的线程,那么就等待他们结束才能进入。

网上查阅了大量的资料,本来想着有没有什么现成的可以用,可后来实在找不到了,如果读者找到了求求私信告诉我一下(可怜巴巴)

可是然而我现在只会用synchronized,可synchronized只能相当于一把锁,直接用显然不现实,后来想到至少计算机系统课上写的信号量原理,可是我不会原子层面操作,但是转念一想,只要给变量操作那边加一个synchronized(this),那不就相当于原子操作了嘛。(恍然大悟了一下,虽然有点骑驴找马的感觉,绕了一大圈)

于是,我想写一个满足我第二段条件的读写锁,也就有了本篇文章。

下面是我的代码:

Lock_Write_Read.java:



public class Lock_Write_Read
	{
		int read=0;
		int write=0;
		boolean wait_write=false;
		public void Get_Read() throws InterruptedException {
			synchronized(this) {
				while(write<0||wait_write){     //等到write全部释放且没有等待中的写线程时才获得锁(即跳出循环)
						wait();
					}
				read--;  
			}
		}
		public void Un_Read() {
			synchronized(this) {
				read++;
				notify();
			}  //释放写线程
		}
		public void Get_Write() throws InterruptedException {
			synchronized(this) {
				while(write<0||read<0) {//等到write和read全部释放才获得锁(即跳出循环)
					wait_write=true;   //将等待标志量点亮后等待被唤醒
					wait(); 
				}
				write--;
			}
		}
		public void Un_Write() {
			synchronized(this) {
				write++;
				wait_write=false;  //将等待标志位熄灭防止read进程进不来
				notify();
			}
		}
	}

利用上述一个类,只要我在写数据之前调用对象的Get_Write(),写完成后调用Un_Write(),就可以达到第二段那样的目的(虽然这种方法像是以锁套锁,运行效率肯定不太好)

但如果会直接的原子操作或者有直接现成的这种功能的锁可能会效率会比这种方法高得多。

如果读者你找到了更好的方法,希望你能私信知会我一声(卑微)

好的找到了资料,java内有现成的ReadWirteLock
对于c++同样有share_lock和lock完成读写锁的目的,对比文内的互斥锁自制的读写锁应该会更加高效。

后续有时间精力再写相关学习吧

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值