序:
关于并发编程控制是java中的一部分重点和难点部分,一般工作中写业务逻辑也很难用到,但当晋级和面试的时候确不可不免的被考量。换工作的时候发现新公司采用了一种巧妙的方式(无知所以巧妙)实现了乐观锁(有种坐井观天的感觉),决定给自己敲响警钟,不要放弃学习和进取的心。
正文:
业务更新与删除的时候采用java sevice类中结合数据库查询来保证并发操作的安全性,这种方式贯通了前后端,首先将数据查询到前端展示,无论是接下来更改还是删除,数据库表的updatetime和主键共同作为条件操作,一旦数据库中的相关数据被更改那么时间被更新后返回到页面提示数据被更新,刷新数据后重试。就完成了cas自旋的一种方式,也有叫数据库+版本号的方式,个人感觉还是比较巧妙的,不用锁但是起到了锁的效果,与autoInteger中的compareAndSet方法有异曲同工之妙,开销相对比较大,毕竟会有个请求然后经数据库查询最后进行比较的过程。使用范围也有限,说是乐观锁是因为,该方法默认数据不会被更改或者较低的概率被修改了,这样直接去进行修改,并未对方法或对象进行上锁,但遇到并发比较高的情况效率会相对比较低。悲观锁相反,指的是并发大概率会发生,所以直接对要操作的资源进行控制,当一个线程用过之后才会放开让其它线程使用。
这种方式除非上其它线程将dateTime时间戳不进行更新,或者出现跟过去的相同的一个时间戳,否则是不会出现AAB这种情况的,就是不太适应频繁修改删除操作的场合。其余都ok了,类似unsafe类中采用native方法实现的cas,不过这不是采用计算机底层实现的方式,反而个人觉得更优雅。