问题:请你谈谈 常见的锁有哪些?
答:悲观锁,乐观锁,互斥锁,自旋锁,读写锁。
悲观锁:悲观锁是认为我们在使用共享资源时会被其他线程修改,容易导致线程安全的问题,所以在访问前总是先对共享资源进行加锁,阻塞其他线程。适用于经常进行写操作的场景
乐观锁:乐观锁通常以CAS操作和版本号机制来实现。其悲观锁相反,会直接对共享资源进行修改,但是在提交更新修改结果前会验证这修改期间有没有其他线程对该资源进行修改,如果没有则提交更新,如果有则放弃本次操作。适用于经常进行读操作而很少进行写操作的场景
互斥锁:互斥锁是最底层的一种锁,其原理是当一个线程占据了这个锁后,其他线程想加锁会加锁失败并且会被阻塞。适用于加锁部分代码的执行时间长
自旋锁:自旋锁也是基于CAS操作来实现的,任何尝试获取该锁的线程都将一直进行自旋,占用cpu的资源。直到获得该锁,并且同一时间内只能由一个线程能获得该锁。适用于加锁部分代码的执行时间短
读写锁:读锁是当没有线程持有写锁时,读锁就能被多个线程并发持有,从而提高资源利用率和访问效率,并且不存在线程安全问题;写锁是任何一个线程持有写锁时,其他线程想要获取读锁或者写锁都会被阻塞。适用于并发要求高的场景