1 前言
近日工作不是太忙,刚好有时间了解一些其他东西,本来打算今天上午去体检,但是看看天气还是明天再去吧,也有很大一个原因:就是周六没有预约上!闲话少说,这里简单对锁来个简单介绍分享。
2 目录
-
第一部分:什么是锁
第二部分:锁的分类
第三部分:锁的作用
第四部分:iOS中锁的实现
第一部分:什么是锁
从小就知道锁,就是家里门上的那个锁,用来防止盗窃的锁。它还有钥匙,用于开锁。不过这里的锁,并不是小时候认知的锁,而是站在程序员的角度的锁。这里我就按照我的理解来介绍一下锁。
在计算机科学中,锁是一种同步机制,用于在存在多线程的环境中实施对资源的访问限制。你可以理解成它用于排除并发的一种策略。看例子
if (lock == 0) {
lock = myPID;
}
上面这段代码并不能保证这个任务有个锁,因此它可以在同一时间被多个任务执行。这个时候就有可能多个任务都检测到lock是空闲的,因此两个或者多个任务都将尝试设置lock,而不知道其他的任务也在尝试设置lock。这个时候就会出问题了。
再看看这段代码:
class Acccount {
long val = 0; //这里不可在其他方法修改,只能通过add/minus修改
object thisLock = new object();
public void add(const long x) {
lock(thisLock) {
val +=x;
}
}
public void minus(const long x) {
lock(thisLock) {
val -=x;
}
}
}
这样就能防止多个任务去修改val了,(这里注意,如果val是public的,那个也会导致一些问题)。
第二部分:锁的分类
锁根据不同的性质可以分成不同的类。
在WiKiPedia介绍中,一般的锁都是建议锁,也就四每个任务去访问公共资源的时候,都需要取得锁的资讯,再根据锁资讯来确定是否可以存取。若存取对应资讯,锁的状态会改变为锁定,因此其他线程不会访问该资源,当结束访问时,锁会释放,允许其他任务访问。有些系统有强制锁,若未经授权的锁访问锁定的资料,在访问时就会产生异常。
在iOS中,锁分为递归锁、条件锁、分布式锁、一般锁(这里是看着NSLock类里面的分类划分的)。
对于数据库的锁分类:
| 分类方式 | 分类 |
|---|---|
| 按锁的粒度划分 | 表级锁、行级锁、页级锁 |
| 按锁的级别划分 | 共享锁、排他锁 |
| 按加锁方式划分 | 自动锁、显示锁 |
| 按锁的使用方式划分 | 乐观锁、悲观锁 |
| 按操作划分 | DML锁、DDL锁 |










