Java中的各种锁和数据库中的锁

Java中的锁

公平和非公平锁:
    公平锁是指多个线程按照申请锁的顺序来获取锁
    非公平锁即打破这个顺序,后来的线程也可以提前获取锁。
在ReentrantLock中可以通过改变构造方法参数,变化锁。但是在synchronized,则默认是非公平锁,无法更改。

可重入锁和不可重入锁
    可重入锁:同一个线程在持有锁的前提下,可以多次获取成功锁。
reentrantLock:通过重写AQS的tryacquire方法实现。首先,判断当前是否可以获取锁,不可以再判断当前线程是不是获取了锁的线程。是则同步标记+1。释放锁的时候,必须同步标记变为0才释放成功。
synchronized,也是类似的。通过一个int值,重复获取锁的线程,这个值会累+1.体现,再一个同步方法中调用另外一个同步方法是可以的

独占锁和共享锁,互斥锁和读写锁
独占,只能有一个线程占有锁。
共享,可以多个线程持有锁。
具体实现锁,互斥锁,ReentrantLock,synchronized
读写锁,ReentrantReadWirteLock。对于读请求可以共享锁。Samphroe

乐观锁和悲观锁
乐观锁,认为不会发生同步安全问题,就仅仅再更新的时候使用CAS操作。
悲观锁,认为必然会发生,就对并发操作都加了锁
具体Java中的锁都是悲观锁,乐观锁的体现应该是无锁也就是原子类。

分段锁
conncurentHashMap中1.7版本的考虑,一个Segment是一个分段,而segment继承了reentrantLock。对于插入操作,只要计算不在一个分段,也就意味着是真正的并行操作。并行度是段数是16.
但是性能不好,再统计size的时候,是要获取全部分段锁的

偏向锁/轻量级锁/重量级锁
synchronzied的一些锁优化,锁升级过程中,锁的名称变化。
偏向锁:同一个线程第一次cas获取锁之后,之后可以直接获取锁。Mark word中记录了偏向锁偏向的线程ID。只要是当前ID,则可直接获取锁。
轻量级锁:自旋锁,有锁竞争的时候,不会直接阻塞线程,而是让线程自旋等待获取锁。好处是:如果是一个短时间的等待,自旋要比阻塞导致的上下文切换性能好。原理:获取锁的时候会将MarkWord cas拷贝一份到当前线程的虚拟机栈帧中。成功则获取成功。释放锁也是cas 拷贝回去。
重量级锁:只要有竞争发生,必然会导致线程阻塞。

数据库中的锁

表锁、元数据锁、行锁

按照缩的粒度:全库锁、表锁、行锁
表锁:
    表独占读锁,所有线程都可以度数据,但是都不可以更新表、表独占写锁,当前线程读写都行,其余线程什么都不能操作
加锁语句:
    lock tables 表名 read 显示添加读锁
    lock tables 表名 write 加写锁
行锁:共享读锁s,排它写锁X
s锁,所有线程只能读该行数据,不能更新
x锁,只有当前线程可以读写。

元数据锁 MDL 当对一个表增删改查,加MDL读锁;表结构改变加MDL写锁。读读不互斥、读写互斥。


一般对行加锁,是以Next-key 为单位的,是一个范围加锁,比如age = 10 ,age = 15 锁的就是(10,15] 

锁是对索引加锁的,如果不通过索引查询,就会使用表锁

加锁语句:
    select...lock in share mode 
    select...for update
    
行锁的行为:
    索引上的等值查询,唯一索引则会退化位行锁
    索引上的等值查询,遇到第一个不满足等值的退化为间隙锁
    唯一索引上的范围查询会访问到不满足的第一个
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值