锁机制用来实现进程线程的同步互斥,保证操作数据的正确性/一致性,来一个一个盘一下:
1.互斥锁:就是经常见到的mutex,每个线程在对共享资源(比如一个作为缓冲区的全局数组)进行操作前先申请互斥锁,申请到的可以进行操作,没申请到的要阻塞阻塞阻塞!
互斥锁的释放只能由加锁的那个线程来释放。
互斥锁只有加锁、解锁两种操作。
2.读写锁:读写锁适合用于读操作多的场景。拥有读锁的线程可以读资源,拥有写锁的线程可以写资源。
某线程对资源加读锁时,其他线程可以也可以加读锁,但是不能加写锁(意味着有人在读的时候,其他人也能读,不能写)。
某线程对资源加写锁时,其他线程什么锁都不能加(意味着有人在写的时候,其他人什么都不能干)。
如果去申请不能加的锁,则阻塞。
读写锁有加读锁、加写锁、解锁三种操作。
3.自旋锁:线程在获取共享资源前先申请获取锁,如果申请不到,则一直继续申请(而不是阻塞),直到申请到为止。
4.排他锁:等于读写锁中的写锁,因为其他人什么都不能干,所以“排他”。
5.共享锁:等于读写锁中的读锁,因为其他人还可以读,所以“共享”。
6.悲观锁:用在数据库中的概念。意思是悲观的认为每次读数据的过程中别人都会修改(还用读取缓冲区数组理解,不要用读取单个变量理解,有可能读了一半数组而后一半被人改了),所以每次读取数据之前都要加锁。
如数据库的行锁,表锁等。
7.乐观锁:也是用在数据库中的概念。意思是乐观的认为每次读数据的过程中别人都不会改,但是在读完进行写的时候会判断在此期间别人有没有去改这个数据,如果别改了,自己就改不成了,要回退。
适用于读操作多的场景。
如CAS机制:Compare And Swap比较并替换,这篇文章讲的很形象
乐观锁的实现机制–CAS(Compare And Set)