今天写课设项目的时候,在搭建后端的时候需要有一个读写锁,大概实现的功能:
成都创新互联公司基于分布式IDC数据中心构建的平台为众多户提供中国电信云锦天府 四川大带宽租用 成都机柜租用 成都服务器租用。在访问互斥资源的时候,当读互斥资源时,如果没有线程写互斥资源,并且没有线程等待去写互斥资源时,那么就允许所有的读线程进入。当写互斥资源时,如果存在读互斥资源的线程或者写互斥资源的线程,那么就等待他们结束才能进入。
网上查阅了大量的资料,本来想着有没有什么现成的可以用,可后来实在找不到了,如果读者找到了求求私信告诉我一下(可怜巴巴)
可是然而我现在只会用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(),就可以达到第二段那样的目的(虽然这种方法像是以锁套锁,运行效率肯定不太好)
但如果会直接的原子操作或者有直接现成的这种功能的锁可能会效率会比这种方法高得多。
如果读者你找到了更好的方法,希望你能私信知会我一声(卑微)
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧