锁的优化机制了解吗?


程序员的公众号:源1024获取更多资料,无加密无套路!

最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》,《Java并发编程实战》等等
获取方式: 关注公众号并回复 电子书 领取,更多内容持续奉上


锁的优化机制是Java等编程语言中常见的一种提高并发性能的方法。锁的优化旨在减少锁的竞争,从而提高程序的性能。

常见的锁优化机制:

  • 无锁

    顾名思义就是没有对资源进行锁定,所有线程都能访问到同一资源。

  • 偏向锁

    偏向锁是一种针对无竞争情况的锁优化机制。它通过消除无谓的获取锁和释放锁的操作,提高了程序的性能。偏向锁会记录哪个线程正在访问某个对象,并且后续的访问请求如果是同一个线程,就可以直接访问,而不需要加锁。

  • 轻量级锁

    轻量级锁是一种针对单线程访问的情况的锁优化机制。它通过使用标记位或者CAS操作来对共享资源进行加锁和解锁,轻量级锁的竞争主要是通过CAS操作来替换对象头的Mark Word,如果成功则获得锁, 失败则会升级为重量级锁。

  • 重量级锁

    成本非常高, 其依赖于操作系统的互斥量(mutex)实现,该操作会导致进程从用户态与内核态之间的切换、线程阻塞造成的线程切换等。被锁对象的重量级锁的指针指向的是monitor对象(也称为管程或监视器锁)的起始地址。每个对象都存在一个monitor与之关联, monitor对象存在于每个Java对象的对象头中。

  • 自旋锁

    自旋锁是一种非阻塞的锁机制,当线程无法立即获取锁时,它会持续检查锁是否被释放,直到获取到锁为止。自旋锁可以减少线程的上下文切换开销,但在锁持有时间较长的情况下,会浪费CPU资源。

  • 自适应锁

    一种结合了自旋锁和阻塞锁的锁机制。在刚开始时,线程会采用自旋的方式来等待锁的释放,但随着时间的推移,如果锁仍然没有被释放,线程会逐渐切换到阻塞状态,从而减少CPU资源的浪费。

  • 分段锁

    分段锁是一种针对共享资源过多的情况下的锁优化机制。它将共享资源分成多个段,每个线程只需要对其中一部分进行加锁和解锁操作,从而减少了锁的竞争和开销。

  • 乐观锁

    乐观锁是一种基于冲突检测的锁机制。它假设多个线程同时访问和修改同一个数据的概率较小,因此在读取数据时不会加锁,而是在提交修改时检测是否存在冲突。如果存在冲突,则进行回滚或重试操作。乐观锁适用于读操作较多的场景。

  • 锁粗化

    指的是对同一个对象反复加锁和解锁的情况,Java就会把锁的同步范围扩展到整个操作之外。比如:连续的两个synchronized(lock){}代码块, 且锁的对象是相同的,那么这种情况就会使锁粗化,两个synchronized(lock){}代码块将会合并成一个synchronized(lock){}代码块。

你可能感兴趣的:(java,java)