课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
java编程开发可以说是目前互联网编程开发领域中使用范围非常广泛的一种编程开发语言了,今天我们就一起来了解一下,学习java编程我们应该掌握哪些场景中锁的应用方法。
垃圾回收的基础思想是什么?
目前JVM的主流垃圾回收器采取的都是可达性分析算法。该算法的实质是将一系列被称为GCRoots的对象作为初始的存活对象合集,然后从该合集出发探索所有能够被该集合引用到的对象,并标记为存活对象。当标记阶段结束之后,未被标记到的对象便是可以清除的。
传统的垃圾回收算法在标记、清除过程中需要中止其他应用线程,即所谓的Stop-The-World。新型的垃圾回收算法,如CMS、G1以及ZGC,尽可能地实现并发标记、清除,从而让Stop-The-World的时间长度可控。
垃圾回收的另一基础思想则是分代回收。JVM会将新生成的对象划为新生代,而将在多次垃圾回收中存活下来的对象划为老年代。JVM会为不同的分代设置不同的回收算法,从而达到新生代多收集、快收集,老年代少收集、全收集的目标。
如何理解Java内存模型?
现代计算机多为对称多处理器的体系架构。每个处理器均有独立的寄存器组和缓存(这在Java内存模型中被抽象为工作内存);多个处理器可同时执行同一进程中的不同线程。
在Java程序中,不同线程可能访问同一变量或对象。如果任由编译器或处理器对这些访问进行优化,则很可能出现在单线程执行思维下无法想象的问题。因此,Java语言规范引入了Java内存模型,通过定义多项规则对编译器和处理器进行限制。
这些规则所体现的为重要的属性便是可见性,即对某一变量的访问能否被同一线程的其他操作,或者不同线程所观测到。Java内存模型引入了多种happens-before关系,以实现上述可见性。以volatile字段为例,对其的写操作happensbefore这之后的读操作,也就是说,我们总能读到volatile字段的新值。
JVM如何应对对象锁的各种场景?
重量级锁是为基础、为低效的对象锁实现。JVM会阻塞加锁失败的线程,并且在目标锁被释放的时候,唤醒这些线程。我们用等红灯作类比。Java线程进入阻塞状态相当于熄火停车,再次点火启动必然耗费时间。JVM会在进入阻塞状态之前进行自旋,也就是怠速停车。如果目标锁能够在短时间内被释放出来,该线程便能够不进入阻塞状态,直接获取该锁。
重量级锁针对的是多个线程同时竞争同一把锁的场景。在现实中,多个线程可能在不同时间段持有同一把锁。为了应对这种没有锁竞争的情况,JVM采用了轻量级锁机制。在加锁时,JVM将在锁对象处做标记,指向当前线程的栈上;在解锁时,上述标记会被清除。如果某线程在请求锁时,发现该锁为轻量级锁,并且指向另一线程所对应的栈,那么它会将该锁膨胀为重量级锁。
偏向锁所应对的场景则更为乐观:至始至终只有一个线程请求某把锁。JVM采取的做法是在一次加锁时为锁对象做标记,使其指向当前线程的地址;在解锁时则不做任何操作。如果下一次请求该锁的仍是同一线程,便直接跳过标记过程;否则,JVM会将该锁膨胀为轻量级锁。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!