什么是“锁” ?
通俗点讲,当你去食堂打饭,人很多的时候,大家都想尽快打到饭,要是大家一拥而上的叫阿姨打饭的话,阿姨也不知道听谁的。这个时候就需要有某种机制约束一下大家的行为。相对于多线程访问某个共享资源的时候,“锁”就应运而生。“多线程”——一群人,“共享资源”——饭菜。
所以,锁就是这个样子。
锁的作用是什么 ?
锁的作用就是维护秩序,让大家有序的去访问资源,而不会因为同时访问产生冲突。
锁的分类 ?
- 从线程是否需要对资源加锁可以分为 悲观锁 和 乐观锁
- 从资源已被锁定,线程是否阻塞可以分为 自旋锁
- 从多个线程并发访问资源,也就是 Synchronized 可以分为 无锁、偏向锁、 轻量级锁 和 重量级锁
- 从锁的公平性进行区分,可以分为公平锁 和 非公平锁
- 从根据锁是否重复获取可以分为 可重入锁 和 不可重入锁
- 从那个多个线程能否获取同一把锁分为 共享锁 和 排他锁
以上的这个分类不知道是怎么分的,个人认为用的最多的就是互斥锁和文件锁。后面对这两种锁说明。
什么情况下需要加锁?
跟上厕所一样,人多的时候你得排队,厕所的锁就是这个“锁”,只让当前这个人使用。当这个用完了,把门打开了,这个动作就行“释放锁”一样。让下一个继续使用。
怎样加锁?
使用最多的是互斥锁和文件锁、互斥锁常用于共享资源,文件锁适用于读写文件。
常用锁的函数:
Windows:
InitializeCriticalSection() :初始化
EnterCriticalSection() :获取锁
LeaveCirticalSection() :释放锁
DeleteCriticalSection() :删除锁
Linux:
pthread_mutex_init() :初始化
pthread_mutex_lock() :获取锁
pthread_mutex_unlock() :释放锁
pthread_mutex_destroy():删除锁