本文共 694 字,大约阅读时间需要 2 分钟。
一.乐观锁
乐观锁是当前线程对数据进行修改时,认为其他线程不会对自己操作的数据进行更改,在数据库层次上使用版本号来避免多线程同时写入,需要满足"提交版本必须大于记录当前版本才能执行更新"的策略
private void updateCountByOpti(Connection connection,Stock stock) throws SQLException { String sql = "update stock set count = count -1,version = version + 1 where version = " + stock.getVersion(); PreparedStatement preparedStatement = connection.prepareStatement(sql); int update = preparedStatement.executeUpdate(); if (update==0) throw new RuntimeException("没抢到"); }
CAS也是一种乐观锁机制,当需要更新时,判断预期值和真实值是否相等,相等则更新,不等一般会自旋操作,在JDK 1.8中CAS不等或者是返回false或者是外置循环使其最后一定更新,
二.悲观锁
悲观锁是当前线程对数据进行修改时,认为其他线程一定会会对自己操作的数据进行更改,数据库可以加悲观锁,如读锁、写锁、行级锁,Java中的synchronizeds是悲观锁
可参考
转载地址:http://uyonn.baihongyu.com/