1.假如有两个线程共同操作数据库,以乐观锁的角度考虑,怎么确保不会发生并发问题?
PS:考点是CAS,比较并替换。CAS中有三个值,内存中的值,新值,旧值。
假如内存中的值是2000,要进行--操作,A,B两个线程分别从主内存中拉去数据,当A线程进行--操作,新值变成了1999,旧值与主内存中的值一致,将新值替换掉主内存中的值,此时主内存值为1999。当B线程进行--操作,新值也是1999,比较主内存值1999与旧值2000不一致,拉去主内存值,在--,此时旧值变成了1999,新值变成了1998……
依次类推,AB线程共同操作共享资源,数据也不会出现并发问题。
2.synchronized的原理
在JDK1.6以前,sync是重量级锁。
重量级锁有一个等待队列,想要抢占锁的线