执行完成后,i=4975这是运行3次以后得到的结果,可以看到每次执行的结果都不一样,而且不是5000,这是为什么呢?这就说明i++并不是一个原子性的操作,在多线程的情况下并不安全。我们把i++的详细执行步骤拆解一下:
执行完成后,i=4986
执行完成后,i=4971
执行完成后,i=5000我们同样执行了3次,3次的结果都是5000,符合了我们预期。这个就是乐观锁。我们对乐观锁稍加总结,乐观锁在读取数据的时候不做任何限制,而是在更新数据的时候,进行数据的比较,保证数据的版本一致时再更新数据。根据它的这个特点,可以看出乐观锁适用于读操作多,而写操作少的场景。
执行完成后,i=5000
执行完成后,i=5000
执行完成后,i=5000我们运行3次,结果都是5000,符合预期。接下来,我们再使用Reent rantLock类来实现悲观锁。代码如下:
执行完成后,i=5000
执行完成后,i=5000
执行完成后,i=50003次运行结果都是5000,完全符合预期。我们再来总结一下悲观锁,悲观锁从读取数据的时候就加了锁,而且在更新数据的时候,保证只有一个线程在执行更新操作,没有像乐观锁那样进行数据版本的比较。所以悲观锁适用于读相对少,写相对多的操作。
执行完成后,i=5000
执行完成后,i=5000
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |