Java锁与并发

锁的基本概念

保护临界区资源不会被多个线程同时访问时而受到破坏。通过锁,可以让多个线程排队。一个一个地进入临界区访问目标对象,使目标对象的状态总是保持一致。

线程安全

无论多个线程如何访问目标对象,目标对象的状态始终保持一致,线程的行为也总是正确的,这说明线程是安全的。 1.关键字Synchronized保证每次只有一个线程访问实例,确保多线程中对象内部数据的一致性。

对象头和锁

在Java虚拟机的实现中,每个对象都有一个对象头,用于保存对象的系统信息,对象头中有一个称为Mark Word的部分,它是实现锁的关键,存放对象的哈希值、对象年龄、锁的指针等信息。 一个对象是否占用锁,占用哪个锁就记录在这个Mark Word.

偏向锁

如果程序没有竞争,则取消之前已经取得锁的线程同步操作。也就是说,若某一锁被线程获取后,便进入偏向模式,当线程再次请求这个锁时,无需再进行相关的同步操作,节省了操作时间。如果在此之前其他线程请求了锁,则锁退出偏向模式。

轻量级锁

如果偏向锁失败,Java虚拟机会让线程申请轻量级锁 当需要判断某一线程是否持有该对象锁时,也只需简单地判断对象头的指针是否在当前线程的栈地址范围即可。

膨胀锁

当轻量级锁失败,虚拟机就会使用重量级锁。

自旋锁

自旋锁可以使线程在没有取得锁时,不被挂起,而转而去执行一个空循环,在若干个循环后,线程如果可以获得锁,则继续执行,若线程依然不能获得锁,才会被挂起。

锁消除

Java虚拟机在JIT编译时,通过对运行上下文的扫描,去除不可能存在共享资源的竞争的锁。通过锁消除,可以节省毫无意义的请求锁时间。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大魏分享(微信公众号:david-share)

JavaEE中资源注入松耦合的实现 | 从开发角度看应用架构13

上下文和依赖注入(CDI)规范是Java EE规范中的许多从属规范之一。虽然CDI是在Java EE 6中引入的,但CDI背后的概念已经出现在各种框架中,包括S...

11420
来自专栏butterfly100

Java并发编程:synchronized和锁优化

1. 使用方法 synchronized 是 java 中最常用的保证线程安全的方式,synchronized 的作用主要有三方面: 确保线程互斥的访问代码块,...

37270
来自专栏栗霖积跬步之旅

Could not resolve view with name '***' in servlet with name 'dispatcher'

今天在开发中遇到了一个问题,控制层使用的是SpringMVC框架。 @RequestMapping("historyDetail") priva...

330100
来自专栏向治洪

svn错误对照表

#, c-format msgid "Destination '%s' is not a directory" msgstr "目的 “%s” 不是目录" ...

37950
来自专栏JAVA技术zhai

干货:Java并发编程系列之synchronized(一)

28770
来自专栏阿杜的世界

RocketMQ学习-NameServer-1

NameServer在RocketMQ中的角色是配置中心,主要有两个功能:Broker管理、路由管理。因此NameServer上存放的主要信息也包括两类:Bro...

14030
来自专栏一个会写诗的程序员的博客

8.8 Spring Boot静态资源处理小结

当使用Spring Boot来开发一个完整的系统时,我们往往需要用到前端页面,这就不可或缺地需要访问到静态资源,比如图片、css、js等文件。

18230
来自专栏Spark学习技巧

锁机制-java面试

何为同步?JVM规范规定JVM基于进入和退出Monitor对象来实现方法同步和代码块同步,但两者的实现细节不一样。代码块同步是使用monitorenter和mo...

41260
来自专栏转载gongluck的CSDN博客

_CrtSetDbgFlag

_CrtSetDbgFlag 若要了解有关 Visual Studio 2017 RC 的最新文档,请参阅 Visual Studio 2017 RC 文档。...

51290
来自专栏芋道源码1024

注册中心 Eureka 源码解析 —— 网络通信

本文主要分享 Eureka 的网络通信部分。在不考虑 Eureka 2.x 的兼容的情况下,Eureka 1.x 主要两部分的网络通信:

12320

扫码关注云+社区

领取腾讯云代金券