Java锁机制 悲观锁和乐观锁

锁的存在,是为了解决在并发环境下,数据的一致性问题。锁机制保证了程序不会出现,脏读,冲突等情况。

先介绍下,悲观锁和乐观锁的基本描述。

悲观锁

正如其名,当出现在多用户的并发环境中时, 它对数据出现并发冲突,持保守态度(悲观)。它假定一定出现冲突,所以在数据处理过程中,将数据锁定,使是数据处于独占状态。

乐观锁

乐观锁的理念与悲观锁相反, 在多用户的并发环境中,它对数据出现并发冲突,吃积极态度(乐观)。在数据处理中,假定数据不存在冲突,从而不锁定数据。为了保证数据的一致性,数据通常会有一个版本号。乐观锁通过版本号判断,数据是否被其他人更新过。如果不一致,就重试,或者放弃修改数据。

从java编程的角度,悲观锁可以理解为通常意义上的同步锁, 如synchronize,Reentrantlock等。乐观锁则是一种更新机制,它保证了数据的一致性,如CAS等。

优缺点

这边讲下在实际应用层面,两者间的主要不同。正如描述的那样,悲观锁通过加锁独占数据,所以不会出现数据修改冲突,但正因为它的锁机制,导致并发效率不高,多线程时有较多等待。而乐观锁,在本质上,对数据并没有加锁,所以不存在线程独占排他现象,所以并发效率更高。但是在竞争激烈的情况下,由于多次重试,效率反而较低。

所以,它们各有特点,所以具体哪个更合适取决于你的应用场景。一般而言,,对于读取频率很高而修改频率较少的需求可以采用乐观锁;数据很敏感且读取频率较低的可以采用悲观锁的方式。

你可能感兴趣的:(Java多线程)