读写锁
读写锁本质是一个自旋锁,用于处理多读少写的情况。
读写锁的行为
当前锁的状态 | 读锁请求 | 写锁请求 |
---|---|---|
无锁 | 可以 | 可以 |
读锁 | 可以 | 阻塞 |
写锁 | 阻塞 | 阻塞 |
注意:
1. 写时独占资源,读时共享资源,写锁优先级更高
2. 写与读之间既有互斥关系又有同步关系。
3. 读写锁与生产消费模型的区别:读者不会将数据独占,也不会影响其他读者的行为。
其他锁
悲观锁
在每次取数据时,总是担心数据会被其他线程修改,所以总会在取数据前先加锁,当其他线程想要访问时比阻塞挂起。典型:读锁,写锁,行锁
乐观锁
每次取数据时,都不认为数据会被其他线程修改,因此不上锁,但是在更新数据前会判断其他数据在更新前是否被修改过。主要才去两种方法:版本号机制和CAS操作。
CAS操作:当需要更新数据时,判断当前内存值与之前取到的值是否相等。若相等则更新,若不等则失败并不断尝试。
自旋锁
不断询问是否可以访问数据。
公平/ 非公平锁
由获得锁的机会是否公平判断
选择锁的方式,取决于等待获得临界资源的时间:
若等待时间较长可以选择挂起等待;若等待时间较短,可以选择自旋锁。