用户空间读写锁的实现

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介:

用户空间的读写锁的实现已经有很多了,评价一个实现的好坏的标准也不一样,本文的实现是一个抄袭,也可以说是一个改进,抄袭谁的呢?当然是我最熟悉的linux内核的了,linux内核的读写锁的实现非常的艺术,都知道读写锁是一种不对称的锁,读和写当然是不对称的,在实现上可以体现为代码上的不对称和数据的不对称,然而这两种不对称却从来没有得到人们的关注,我在一本讲MySQL源代码的书上看到了一段描述,主要是讲为何MySQL不用读写锁而用互斥锁,作者认为是读写锁实现起来太复杂,会多浪费好几个cpu周期,实际上得到的优惠还不足以弥补cpu周期浪费。从这一段描述中可以看得出的是,MySQL的作者将读写锁实现中不对称设想成了代码的不对称,这样才会得到浪费cpu周期的结论,如果考虑数据的不对称,哪个数据对于cpu来讲是无所谓的,只是代码加工的原料而已。linux内核巧妙的使用了数据的不对称性来实现读写锁,这个就自己看代码吧。

近期我在一篇blog上看到了一个读写锁的实现,语言是java,用什么语言似乎不是那么重要,关键是如何实现的,首先看一下这个代码:

public class ReadWriteLock {

private boolean isRead;

private boolean isWrite;

public synchronized void readLock() {

while (isWrite) {

try {

wait();

} catch (InterruptedException ex) {

ex.printStackTrace();

}

}

isRead=true;

}

public synchronized void readUnlock() {

isRead=false;

notifyAll();

}

public synchronized void writeLock() {

while(isRead) {

try {

wait();

} catch(InterruptedException ex) {

ex.printStackTrace();

}

}

while(isWrite) {

try{

wait();

} catch(InterruptedException ex) {

ex.printStackTrace();

}

}

isWrite=true;

}

public synchronized void writeUnlock() {

isWrite=false;

notifyAll();

}

}

看完了给人的感觉就是简单之极,很容易理解,面试的时候肯定能过关,但是明显read和write的lock代码量不同,写锁的代码量几乎是读锁的两倍,如果看了下面的实现,如果下面实现的作者和上面的作者一起参加了一场面试,我估计上面的哥们就危险了,当然同时被录取更好,就怕是二选一的情况。看完上面的实现以后我估计MySQL的作者担心是有道理的,他肯定也把读写锁的实现想成了上面的样子,下面看看仿linux内核的实现:

public class ReadWriteLock {

int count = 200;

int delta = count; //读锁的共享量,当然可以更大些,200000都可以。

public synchronized void readLock() {

doLockUnlock(1, 1);

}

public synchronized void readUnlock() {

doLockUnlock(delta, 0);

}

public synchronized void writeLock() {

doLockUnlock(delta, 1);

}

public synchronized void writeUnlock() {

doLockUnlock(delta, 0);

}

public synchronized void doLockUnlock(int delta, int op) {

if (op) {

while(count-delta <=0) {

try {

wait();

} catch(InterruptedException ex) {

ex.printStackTrace();

}

}

count -= delta;

} else {

count += delta;

notifyAll();

}

}

}

最后说一下,上面的仿linux内核的实现的作者就是我自己。


 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1274104


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
Linux 程序员 API
POSIX互斥锁自旋锁
POSIX互斥锁自旋锁
45 0
|
12天前
|
算法 程序员 编译器
4.进程同步
4.进程同步
|
4月前
|
Linux C语言
linux c 多线程 互斥锁、自旋锁、原子操作的分析与使用
生活中,我们常常会在12306或者其他购票软件上买票,特别是春节期间或者国庆长假的时候,总会出现抢票的现象,最后总会有人买不到票而埋怨这埋怨那,其实这还好,至少不会跑去现场或者网上去找客服理论,如果出现了付款,但是却没买到票的现象,那才是真的会出现很多问题,将这里的票引入到多线程中,票就被称为临界资源。
31 0
|
4月前
|
Linux
【Linux C 几种锁的性能对比】 1.读写锁 2.互斥锁 3.自旋锁 4.信号量 5.rcu
【Linux C 几种锁的性能对比】 1.读写锁 2.互斥锁 3.自旋锁 4.信号量 5.rcu
|
11月前
|
存储 缓存 安全
Linux下线程同步(带你了解什么是互斥锁、死锁、读写锁、条件变量、信号量等)
Linux下线程同步(带你了解什么是互斥锁、死锁、读写锁、条件变量、信号量等)
126 0
使用共享内存作为进程互斥锁的代码
使用共享内存作为进程互斥锁的代码
84 0
|
Android开发 数据安全/隐私保护 C++
多线程、多进程同时操作MMAP,会怎么样?(一)
多线程、多进程同时操作MMAP,会怎么样?
195 0
多线程、多进程同时操作MMAP,会怎么样?(一)
|
Linux
多线程、多进程同时操作MMAP,会怎么样?(二)
多线程、多进程同时操作MMAP,会怎么样?
276 0
|
Java
Java多线程中的读写互斥锁
只有读读是并发的, 其它读写,写写,写读都是互斥的哟。
1506 0