java中的各种锁简介

java中的各种锁

  1. 乐观锁 VS 悲观锁

    • 概念

      • 乐观锁是指默认认为在操作数据的时候不会有别的线程来干扰,所以不会添加锁,只是在更新的时候,需要检查数据有没有别的线程对这个数据进行更新,如果进行了更新,那么我就需要进行一系列其他的操作来实现(报错或者重试),如果没有被其他的线程更新,那么我直接写入就可以了
      • 悲观锁就跟我们平时使用的差不多了,synchronized 和Lock类中都是悲观锁,也就是说悲观锁默认在自己使用数据的时候一定会有别的线程来修改,所以需要加锁来实现

      乐观锁在java中通过使用无锁编程来实现,最常用的就是CAS算法,是一种原子递增操作,自旋

      一般情况下,我们可以看到

      • 悲观锁一般用于写操作比较多的地方
      • 乐观锁一般用于读操作比较多的地方
  2. 自旋锁 VS 适应性自旋锁

    在java中线程之间的唤醒或阻塞是需要CPU的调度的,所以我们要尽可能的减少CPU的浪费,但是还需要尽量提高CPU的利用率,所以就有了自旋锁和非自旋锁

    • 自旋锁:当一个线程想要访问数据的时候,但是这个数据正在被别的线程占据,所以我们需要等待,但是不进入阻塞休眠状态,而是在那里自旋(自旋的意思就是一个死循环,在里面无限期的等待资源),这样就减少了CPU唤醒线程的开销
    • 非自旋锁:当一个线程想要访问数据,但是却被占据了,这个时候不进行自旋,而是直接进入到休眠状态。

    自旋锁适用于用户操作的时间短,也就是操作数据的时间很短的情况下,而非自旋锁适用于用户操作数据的时间长的情况下

    自旋的实现原理也是CAS

  3. 无锁 VS 偏向锁 VS 轻量级锁 VS 重量级锁

    • Monitor 可以理解为一个同步工具或者一种同步机制,通常被描述为一个java对象,在java中每一个内部的对象都有一把看不见的锁,叫内部锁或monitor
    • 无锁是指没有对资源进行锁定,所有的线程访问并修改同一个资源,但是只有一个线程能够成功,无锁使用的是CAS的实现,原子操作,如果别的线程灭有获得锁,那么就在循环尝试获取这个值,无锁的特点就是效率高
    • 偏向锁:顾名思义,一定是偏向于某一个线程,一般用于只有一个线程的时候,目标就是只有一个线程执行时性能高,所以也就是说只要一个线程获得了这个锁,那么就会一直归这个线程所有,当有其他的线程来竞争锁的时候,这个时候我们才会释放偏向锁
    • 轻量级锁:当锁是偏向锁的时候,被另外的线程访问,这个时候偏向锁就升级成为了轻量级锁,也就是说这个时候只有一个线程持有锁,访问数据区,但是其他的线程都在那里自旋,尝试获得锁
    • 重量级锁:当一个线程持有锁的时间过长,其他的线程在自选时候达到了一定的次数就会进入阻塞状态(为了减少CPU的开销),这个时候轻量级锁升级为重量级锁。sync使用的就是重量级锁,使用monitor实现,而monitor使用的是底层的Mutex LOCK来实现的
  4. 公平锁 VS 非公平锁

    这个在我的上一篇博客中讲到,也写明了原理,讲的比较详细

  5. 可重入锁 VS 非可重入锁

    java中的 ReentrantLock和synchronized 都是重入锁

    • 重入锁:是指在同一个类或者对象中,可以共享一把锁,也就是说我们可以想象成一个对象拿到了这个锁,那么这个锁中的所有的方法都默认拥有了这个锁

    • 不可重入锁:就是指即使是同一个对象,但是也要再次获取锁

      但是这里有一个问题,也就是说现在如果我一个对象中的方法一拿到了这个锁,操作同步数据,但是我方法一调用了方法二,方法二也需要获取锁,但是这是一个不可重入锁,所以就陷入了死锁的状态

  6. 独享锁 VS 共享锁

    独享锁和共享锁同样是一种概念。我们先介绍一下具体的概念,然后通过ReentrantLock和ReentrantReadWriteLock的源码来介绍独享锁和共享锁。

    独享锁也叫排他锁,是指该锁一次只能被一个线程所持有。如果线程T对数据A加上排它锁后,则其他线程不能再对A加任何类型的锁。获得排它锁的线程即能读数据又能修改数据。JDK中的synchronized和JUC中Lock的实现类就是互斥锁。

    共享锁是指该锁可被多个线程所持有。如果线程T对数据A加上共享锁后,则其他线程只能对A再加共享锁,不能加排它锁。获得共享锁的线程只能读数据,不能修改数据。

    独享锁与共享锁也是通过AQS来实现的,通过实现不同的方法,来实现独享或者共享。

内容概要:本文详细介绍了如何利用Simulink进行自动代码生成,在STM32平台上实现带57次谐波抑制功能的霍尔场定向控制(FOC)。首先,文章讲解了所需的软件环境准备,包括MATLAB/Simulink及其硬件支持包的安装。接着,阐述了构建永磁同步电机(PMSM)霍尔FOC控制模型的具体步骤,涵盖电机模型、坐标变换模块(如Clark和Park变换)、PI调节器、SVPWM模块以及用于抑制特定谐波的陷波器的设计。随后,描述了硬件目标配置、代码生成过程中的注意事项,以及生成后的C代码结构。此外,还讨论了霍尔传感器的位置估算、谐波补偿器的实现细节、ADC配置技巧、PWM死区时间和换相逻辑的优化。最后,分享了一些实用的工程集成经验,并推荐了几篇有助于深入了解相关技术和优化控制效果的研究论文。 适合人群:从事电机控制系统开发的技术人员,尤其是那些希望掌握基于Simulink的自动代码生成技术,以提高开发效率和控制精度的专业人士。 使用场景及目标:适用于需要精确控制永磁同步电机的应用场合,特别是在面对高次谐波干扰导致的电流波形失真问题时。通过采用文中提供的解决方案,可以显著改善系统的稳定性和性能,降低噪声水平,提升用户体验。 其他说明:文中不仅提供了详细的理论解释和技术指导,还包括了许多实践经验教训,如霍尔传感器处理、谐波抑制策略的选择、代码生成配置等方面的实际案例。这对于初学者来说是非常宝贵的参考资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值