Java多线程锁策略, cas 和 synchronized

常见的锁策略

1.乐观锁vs悲观锁

乐观锁:简的来说就是预期锁的冲突概率很低。

悲观锁:与乐观锁相反,预期冲突率很高。

2.读写锁vs普通的互斥锁

读写锁:顾名思义,就是指使用这个锁的时候可以选择操作,对于读写锁来说,共有三个操作,加读锁,加写锁和解锁,前两个对别对读操作加锁和对写操作加锁,针对读锁和写锁之间并不存在互斥关系。

3.重量级锁vs轻量级锁

重量级锁:就是做了很多事情,开销很大,通常情况下可以认为,悲观锁一般都是重量级锁。

轻量级锁:做的事情很少,开销小,同理,一半对应轻量级锁。

在使用锁的过程中,如果锁是基于一些功能来实现的(比如调用了操作系统提供的mutex接口),此时,一般认为这里是重量级锁,(操作系统的锁会在内核中做许多事情,比如让线程阻塞等待等等) 如果锁是纯用户态实现的,此时一般认为这是轻量级锁(用户态的代码更可靠,也更高效)

4.挂起等待锁vs自旋锁

挂起等待锁:通常就是通过内核的一些机制来实现的,往往较重(重量级锁的一种典型实现)

自旋锁:往往就是通过用户态代码来实现的,往往较轻(轻量级锁的一种典型实现),

优点: 没有放弃 CPU, 不涉及线程阻塞和调度, 一旦锁被释放, 就能第一时间获取到锁.
缺点: 如果锁被其他线程持有的时间比较久, 那么就会持续的消耗 CPU 资源. (而挂起等待的时候是
不消耗 CPU 的)

5.公平锁vs非公平锁

公平锁:多个线程在等待一把锁的时候,谁先来的,谁就能获取到这个锁(遵循先来后到的原则)

非公平锁:多个线程等待一把锁的时候,不遵循先来后到原则(每个等待的线程获取到这把锁的概率都是均等的)

6.可重入锁vs不可重入锁

一个线程如果可以多次加锁,不会死锁,就是可重入锁,反之,就是不可重入锁。

看到这,我们就想到前面讲的synchronized,那他是属于什么锁呢?

synchronized

1.它既是一个乐观锁,也是一个悲观锁(根据锁竞争的激烈成都,自适应)

2.它不是读写锁,只是一个普通的互斥锁

3.它既是一个轻量级锁,也是一个重量级锁,同理,也是根据锁的竞争激烈成都来自适应

4.沁凉几所的部分基于自旋锁来实现,重量级的部分基于挂起等待锁来实现。

5.他是非公平锁

6.是可重入锁

CAS(campare and swap)

CAS要做的事情就是那寄存器中或者内存中的值,和另外一个内存中的值进行比较,如果值相同了,就把另一个寄存器或者内存中的值和当前的这个内存的进行交换

 

此处所谓的CAS指的是CPU提供了一个单独的CAS指令,通过这一条指令,就能完成上述操作,如此,我们知道CPU上面的指令时一条一条执行的,指令已经是不可分割的单位,这样这个指令就具有原子性,此时线程就安全了,CAS的最大意义就是让我们写这种多线程安全的代码,提供了一种全新的思路和方式。那么CAS能干些什么呢?我们下一章再来细细道来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值