谈谈Java中的锁机制

一、Synchronized关键字原理

什么是Synchronized

Synchronized是java内建的同步机制,提供了互斥的语义和可见性,当一个线程已经获取当前锁时,其他试图获取锁的线程会被阻塞

Synchronized核心组件

  • Wait Set

    那些调用wait方法被阻塞的线程被放置在这里

  • Contention List

    竞争队列,所有请求锁的线程首先被放在这个竞争队列中

  • Entry List

    Connection List 中那些有资格成为候选资源的线程被移动到Entry List

  • OnDeck

    任意时刻,最多只有一个线程正在竞争锁资源,该线程被称为OnDeck

  • Owner

    当前已经获取到资源的线程被称为 Owner

  • !Owner

    当前释放锁的线程

在这里插入图片描述
图中需要注意的是 :
步骤2中的移动线程是在Owner线程在unlock时,将Contention List中的部分线程移动到Entry List

步骤3中Owner线程并不直接把锁传递给OnDeck线程,而是把锁竞争的权利交给OnDeck,OnDeck需要重新竞争锁,JVM中这种选择行为称为 “竞争切换”

Synchronized是非公平锁,Synchronized在线程进入Contention List时,等待的线程会先尝试自旋获取锁(CAS),如果获取不到就进入Contention List,这对于已经进入队列的线程是不公平的,还有一个不公平的事情是自旋获取锁的线程还可能直接抢占OnDeck线程的锁资源

在Java 1.6中,Synchronized进行了优化,有适应自旋,锁消除,锁粗化,轻量级锁及偏向锁,效率上有了本质的提高

S

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java垃圾回收机制是Java虚拟机(JVM)自动管理内存的一种机制。在Java程序,程序员不需要手动分配和释放内存,而是由JVM负责自动回收不再使用的对象。 Java垃圾回收机制的基本原理是通过“可达性分析”来确定哪些对象是存活的,然后回收那些不再被引用的对象。可达性分析是从一组称为“GC Roots”的起始对象开始,通过引用链来遍历和标记可达对象。无法通过引用链访问到的对象则被标记为可回收的垃圾对象。 Java垃圾回收机制的工作过程分为三个阶段:标记、清除和整理。在标记阶段,垃圾回收器标记所有可达对象。在清除阶段,垃圾回收器回收标记为垃圾的对象,并且释放它们所占用的内存空间。在整理阶段,垃圾回收器将存活的对象向一端移动,以便在内存布局形成连续的内存块。这样可以解决内存碎片问题,提高内存利用率。 Java垃圾回收机制具有以下优点: 1. 自动化管理:程序员不需要手动释放内存,减少了内存泄漏和悬挂对象(对象已被释放但仍然被引用)的可能性。 2. 高效性能:Java垃圾回收机制采用分代回收算法,根据对象的存活时间将内存分为多个代,根据不同的代使用不同的垃圾回收算法,提高了回收效率。 3. 防止空指针异常:垃圾回收器可以检测并处理不再使用的对象,避免了程序运行过程的空指针异常错误。 4. 提高开发效率:不需要手动管理内存,减少了程序员的工作量,提高了开发效率。 然而,Java垃圾回收机制也存在一些问题,比如垃圾回收过程可能会导致程序的暂停时间变长,对实时性要求较高的程序可能会受到影响。此外,垃圾回收机制的性能也会受到堆内存的大小和程序的运行负载等因素的影响。 总的来说,Java垃圾回收机制是一种非常成熟和高效的内存管理机制,它解放了程序员手动管理内存的负担,提高了开发效率和程序的健壮性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值