Java中包含的锁
1.悲观锁
悲观锁假设存在高度争用资源的情形,因此在修改数据的时候会直接加锁,防止其它线程的访问。其实现方式就是通过synchronized或者lock的方式对方法、代码块进行加锁。
优点:实现简单,可以完全避免多线程冲突。
缺点:加锁的范围大,可能会造成不必要的性能开销。
2.乐观锁
乐观锁假设不存在多线程冲突,所以不会添加锁。但在更新数据的时候会判断在此期间是否有其它线程修改了数据,如果有则取消本次操作,否则执行更新。
其实现方式通常是采用CAS算法,如Java中的Atomic包。或在数据表添加版本号,在更新时检查版本号。
优点:不会阻塞线程,提高了程序的并发性。
缺点:如果频繁出现数据更新冲突,会造成性能开销。
数据库中包含的锁
表级锁:给整张表进行加锁操作,是锁定粒度最大的一种锁。表级锁实现简单,资源消耗比较少,但是表级锁触发锁冲突的效率会更高一些。
行级锁:只对当前操作的行记录进行加锁,其锁定粒度较小。行级锁的开销比较大,资源消耗多,但是能大大减少数据库的锁冲突。
共享锁:用于所有数据的只读操作,可允许多个并发事务获取共享锁。
排他锁:用于所有数据的写和修改操作,不允许多个事务获取排他锁。