JAVA并发-各种锁类型

悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
乐观锁:假定不会发生并发冲突,只在提交时检查是否违反数据完整性的操作

java中的悲观锁和乐观锁:
java的独占锁就是一种悲观锁,例如sychronized、lock,缺点:存在进程频繁挂起和恢复的性能消耗
java的CAS就是乐观锁的一种应用,每次操作都不加锁,假设没用冲突去完成操作,发生冲突就重试,直到成功为止,但是使用CAS要注意一个问题:ABA问题

独占锁:一个锁一次只能被一个线程所持有,比如:synchronized、ReentrantLock
共享锁:一个锁可以被多个线程共用,比如:ReadWriteLock,其中读锁是共享的,写锁时独占的

互斥锁:独占锁的一种具体实现,比如:ReentrantLock
读写锁:比如:ReadWriteLock

偏向锁:一个锁一直被一个线程访问并持有,那么该线程会自动获取锁,性能消耗低
轻量级锁:当锁是轻量级锁时,被另一个线程访问,这时就会变成轻量级锁,其他线程会通过自旋地形式获取锁,不会阻塞,提高性能
重量级锁:当其他线程通过自旋方式不能获取到锁时,旋转到一定次数,还没有获取到锁,就会进入阻塞状态,该锁膨胀为重量级锁,性能降低

自旋锁:获取锁的线程会采用循环的方式去尝试获取锁,这样的好处是可以减少上下文切换,缺点是消耗cpu性能


一个比较典型的使用乐观锁的例子:
购票系统,1w人购买票,票只有一张,怎么实现?
1.首先要保证这张票在被购买前是可以被所有人看到的
2.其次要保证一个购买该票后,其他人的购买交易会失败
3.要考虑是分布式系统还是单一系统

这里分两种情况考虑:
单一系统下:可以采用java乐观锁形式来实现,volatitle+CAS。
分布式系统下:可以基于数据库层来实现,通过使用冗余字段版本号控制,来实现修改信息时,匹配版本号成功,则容许修改记录,如果匹配失败则不允许修改,通过看数据库返回的update_row可以看出是否修改成功。


你可能感兴趣的:(java并发)