乐观锁
因为热爱,所以拼搏。 --RuiDer
前导必备
- Java并发锁的含义
- 悲观锁
- 数据库
高并发
高并发简单理解就是在服务器中,成千上完个客户端在同一时间内发
起对服务器端的请求,包括数据的请求,这时服务器后端需要在极短时内处
理客户端的请求并且响应,在互联网平台,追求的是速度和时间,所以,
这就对服务器端有非常大的考验。
一般客户端发起请求,服务器端接到请求,首先去处理相应的数据,
这就涉及到数据库中的数据操作,或者是缓存中的数据处理,总之要与数据库打交道。
操作数据库数据包括数据的查询,编辑,更新等。
高并发产生的问题
不同的线程在同一时间对同一数据的读取和更新产生冲突。可能会出现线程A读取
的数据不是最新值,线程B更新的数据覆盖其他线程对该数据的更新。这些问题
都是高并发带来的,即高并发产生的问题。
高并发冲突分类:
- 数据丢失
- 脏读
锁
Java提供锁的支持,通俗的理解就是锁对某些数据具有保护作用,防止某一数据在同一时间
被多个线程操作。
锁的分类:
- 悲观锁:持保守态度,只能由某一个线程持有,其他线程等待持有锁的线程释放锁。性能差
- 乐观锁:下面讲
- 其他锁:像自旋锁,轻量级锁等
乐观锁概念
对于每一个数据或者数据集合,设有一个标识version(字段),
当线程读取数据时,同时会读取出标识版本version的值,进行更
新时,首先比较当前数据库字段version的值是否与读取出的
version值相等,如果相等,则更新值,否则,作为过期值丢弃。
乐观锁的实现
实现一:
比如一个数据库表的结构是
id value version三个字段
当进行数据的更新时,首先读取:
select value version from table where id=x;
其次更新:
update table set value=newValue, version=oldVersion+1 where id=x and version=oldVersion;
实现二:
cas算法:Compare And Swap算法,即有三个值,内存值,预期旧值,新值,
比较内存值是否与当前预期值相等,如果相等,则替换新值,否则,不做任何处理。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。