二:乐观锁其实只是保证从 tryOptimisticRead 到 validate 之间的代码执行的逻辑完整性,也就是我这一次get取到的数据是一个线程中的数据。没有被其他线程污染的。
long stamp = stampedLock.tryOptimisticRead(); // 获得一个乐观读锁 // 注意下面两行代码不是原子操作 // 假设x,y = (100,200) double currentX = x; // 此处已读取到x=100,但x,y可能被写线程修改为(300,400) double currentY = y; // 此处已读取到y,如果没有写入,读取是正确的(100,200) // 如果有写入,读取是错误的(100,400) if (!stampedLock.validate(stamp)) { // 检查乐观读锁后是否有其他写锁发生
三:乐观锁比上一节悲观锁为什么会提高并发效率,上一节,假设一个线程正在读,读的时候是不允许写入的,而乐观锁其实没有加锁,随时可以写入。乐观锁只会检测我获取到这一次数据的数据是一个线程中的。但是潜意识告诉我这块没这么简单,,以后再研究。&&^^
Sign in to make a reply
Loading...
评论区看到老师两句重点:
一:乐观锁其实不上锁,只检查版本号,它的目的是把read-write-lock的read加读锁这一步给去了,因为绝大多数情况下没有写,不需要加读锁。
二:乐观锁其实只是保证从 tryOptimisticRead 到 validate 之间的代码执行的逻辑完整性,也就是我这一次get取到的数据是一个线程中的数据。没有被其他线程污染的。
三:乐观锁比上一节悲观锁为什么会提高并发效率,上一节,假设一个线程正在读,读的时候是不允许写入的,而乐观锁其实没有加锁,随时可以写入。乐观锁只会检测我获取到这一次数据的数据是一个线程中的。但是潜意识告诉我这块没这么简单,,以后再研究。&&^^