并发编程中的锁补充知识

本文深入探讨了并发编程中的关键概念,包括可重入锁的特性,自旋锁的优缺点,以及CAS比较交换算法的工作原理。此外,还介绍了AQS(AbstractQueuedSynchronizer)如何维护共享资源状态并管理线程同步。这些机制在Java的并发库如`synchronized`和`java.util.concurrent.atomic`原子类中得到广泛应用。
摘要由CSDN通过智能技术生成

1、可重入锁:

可重入锁也叫做递归锁,指同一个线程外层函数获得该锁之后,内层的递归函数仍可以获取该锁。就是线程可以同时获得一个锁多次,synchronized,ReentrantLock都是可重入锁。

2、自旋锁

如果持有锁的线程能在很短时间内释放锁资源,那么那些等待竞争的锁的线程就不需要做内核态和用户态之间的转换(线程私有内存,和共有内存),进入阻塞,挂起状态等。优点:

自旋锁可以减少CPU上下文的切换,对于占用锁的时间非常短或者锁竞争不激烈的代码块来说性能大幅度提升。缺点:线程在自旋过程中会长时间获取不到锁资源。引起CPU的浪费。

3、CAS 比较交换

CAS 比较交换算法,CAS(V,E,N) V 是现在内存中的值,E 是上一次取出的值,N是要更新的新值。实现原理是先获取E,然后在更新N的时候,用V和E对比,如果V和E相同就认为数据没有发生变化,可以更新,如果V和E不同了,那就说明其他线程对对值进行了修改,那么当前线程不做任何修改。

在jdk中有一个java.util.concurrent.atomic 里面提供了一组原子类就是使用CAS实现的。

4、ABA问题:

就是线程再获取E之后,而线程将V中的A改成了B,过段时间又将B改为了A,这种操作CAS算法是没法检测到的,这种可以添加一个版本号来解决。

5、AQS

AQS(Abstract Queued Synchronizer) 是一个虚拟的队列同步器,通过维护一个共享资源状态(Volatile int State) 和一个先进先出的队列实现多线程共享资源。

AQS 我觉得原理应该是:

共享资源有一个资源状态state ,一个线程来了会去判断state,通过判断state知道共享资源状态是否可以执行。如果当前状态可执行,就操作共享资源,如果资源状态是不可执行状态,就会调用wait() ,当前线程就会放弃CPU资源,Runnable对象就会进入同步队列,由先进先出的算法去出队列

 

java.util.concurrent 这个包里面包含并发编程的操作,包含各种锁,以及原子类。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值