鄙人很是惭愧,当了三年程序员,才刚刚对锁有个初步浅显的认识。。。
下面我说的东西可能不太准确,请大神们海涵,有更好的理解,请在评论区多多指正。
首先,究竟什么是锁?
从业务场景上来讲,系统中有一条数据,用户A在修改的同时,用户B也想修改,用户A给本条数据加上锁之后,用户B就不能同时修改了。Java代码层面的这个锁,是针对某一条数据的。
其次,怎么实现这个锁?
第一,需要一个公共锁空间,来保存锁。这样用户A和用户B在修改数据前先查一下对应数据有没有加锁。
第二,锁包含的信息一定是能唯一标识要修改的数据,最简单的就是对应数据的主键PK。
第三,加锁(也叫申请锁),就是用户拿着数据的主键PK去锁空间中查询,如果查到了,就说明当前数据是被锁的,则不能操作;如果没有查到,则顺势加个锁,表示这个数据这次被我锁住了,就不允许其他人操作了。
第四,解锁,用户操作完数据一定要解锁,不然数据一直被锁着,其他人也就一直不能操作此数据了。
以上就是锁实现的具体原理。
排他锁:保证同一时刻只能有一个用户修改同一数据。
共享锁:共享锁,对于某类操作可以并发执行,即在没有排他锁的情况下,重复申请共享锁可以成功;而排他锁只能申请一次。共享锁需要和排他锁配合使用,用于A类操作可以并发访问一个表,但A类与B类操作不能并发。