Java锁

2021-02-1647

Java锁(https://www.jianshu.com/p/d2ac26ca6525

--乐观锁

乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做。乐观锁适用于读操作多的场景,这样可以提高程序的吞吐量。

 

java中实现乐观锁的方式

1.CAS – java.util.concurrent.atomic包下面的原子变量

2.版本号控制,修改一次版本号+1 在提交更新的时候,版本号一直执行更新操作,不同时交给用户处理,抛出异常

 

--自旋锁

如果持有锁的线程能在很短时间内释放锁资源,那么那些等待竞争锁 的线程就不需要做内核态和用户态之间的切换进入阻塞挂起状态,它们只需要等一等(自旋), 等持有锁的线程释放锁后即可立即获取锁,这样就避免用户线程和内核的切换的消耗。

一直吃cpu,要设置一个自旋最大时间

 

--悲观锁

在修改数据之前先锁定,再修改的方式被称之为悲观并发控制

--共享锁【shared locks】又称为读锁:多个事务可以共享一把锁,都能访问数据,只读不写

--排他锁【exclusive locks】又称为写锁:多个事务不可共享锁,只能有一个线程或事务获得锁的拥有权,但可以读也可以写

 

优缺点:数据处理的安全提供了保证。但是在效率方面,处理加锁的机制会让数据库产生额外的开销,还有增加产生死锁的机会。另外还会降低并行性

 


上一篇:锁池与等待池 下一篇:后台线程