31. 详细阐述volatile ?为什么它能保证变量对所有线程的可见性? |
volatile只能作用于变量,保证了操作可见性和有序性,不保证原子性。 在Java的内存模型中分为主内存和工作内存,Java内存模型规定所有的变量存储在主内存中,每条线程都有自己的工作内存。 主内存和工作内存之间的交互分为8个原子操作: 1.lock 2.unlock 3.read 4.load 5.assign 6.use 7.store 8.write volatile修饰的变量,只有对volatile进行assign操作,才可以load,只有load才可以use,这样就保证了在工作内存操作volatile变量,都会同步到主内存中。 |
🚀🚀🚀🚀🚀🚀 |
32. 乐观锁一定就是好的吗? |
乐观锁认为对一个对象的操作不会引发冲突,所以每次操作都不进行加锁,只是在最后提交更改时验证是否发生冲突,如果冲突则再试一遍,直至成功为止,这个尝试的过程称为自旋。 乐观锁没有加锁,但乐观锁引入了ABA问题,此时一般采用版本号进行控制 |