JAVAEE---多线程(进阶)

锁的策略

这里锁的策略并不只对java,其他编程语言也适用。

乐观锁与悲观锁

乐观锁:在加锁之前预估锁冲突发生的概率较小,在加锁的过程中所做的工作较少。(加锁块,但出现问题概率大)

悲观锁:在加锁前预估所冲突发生的概率大,所以在加锁过程中所做的工作较多。(加锁满,但出现问题概率小)

轻量级锁与重量级锁

轻量级锁:加锁开销小,加锁速度块。对应乐观锁

重量级锁:加锁开销大,加锁速度慢。对应悲观锁

本质上将这两组是一样的东西,只是站的角度不同。乐观/悲观是在加锁前的预估,而轻量级/重量级是在加锁后对性能进行的评估。

自旋锁与挂起等待锁

自旋锁是轻量级锁的一种典型实现。加锁时搭配一个循环,加锁成功自然跳出循环,但加锁失败则马上再次获取。缺点在于cpu开销大。而且必须锁竞争不激烈。过于激烈就无法保证获取锁而且占用了cpu。这也是它乐观锁的体现

挂起等待锁

挂起等待锁是重量级锁的一种实现。它可以应用与竞争激烈的情况。这里当加锁失败就会阻塞等待,放弃cpu的调度。等待唤醒。这个相比与上面就没有上面那么及时。

而我们所使用的synchronized加锁这是可自适锁,它可以自己判断来决定是乐观锁还是悲观锁。

普通互斥锁和读写锁

普通互斥锁

例如synchronized,涉及到加锁和解锁

读写锁

读锁:读的时候可以读不能写

写锁:写的时候不能读也不能写

引入读写锁可以减少两个线程都进行读操作引起的阻塞问题

公平锁与非公平锁

公平锁:按照先来后到来进行加锁(可以天然解决线程饿死的情况)

非公平锁:抢占式随机执行

可重入锁与不可重入锁

可重入:一把锁在一个线程里面进行了连续两次的加锁,可以加为可重入锁。

CAS

是一条cpu指令。

用CAS编写的代码天使都是线程安全的-->无锁编程

这样的代码更高效

它的原理其实就是解决了之前我们内存中的值和寄存器的值不同的问题。

它可以在你修改了内存中的之后发现值不同进行重新获取内存中的值到寄存器中。

你可能感兴趣的:(java,java-ee,多线程,开发语言)