【synchronized】同步方法与同步块

简介: 【synchronized】同步方法与同步块

这里我们分三块来解读学习:

同步方法思想
同步块思想
同步方法与同步块的区别

1. 同步方法思想

同步方法思想简化图

上面是我画的同步方法思想简化图,我们将每个对象类比喻为房子,对象类拥有的多个方法比喻为很多房间,有同步锁的方法比喻为有锁的房间(锁放在房间门口),没有同步锁的方法比喻为没有锁的房间,方法的调用者我们将其比喻为想要进入某个房间的人。想进入这些房间有一些规则必须遵守,这里可以比喻为家规吧。
规则:

  • 没有锁的房间可以不用等待进入,而且可以容纳多人;
  • 有锁的房间必须有钥匙才可进入,而且只可容纳一人;
  • 对于有锁的房间,如果门口有钥匙则进入,如果没有,说明房间内有人,则排队等待拿到钥匙才可以进入;
  • 从有锁的房间出来后,如果想要再次进入,必须归还钥匙之后,在门口重新排队等待钥匙。

2. 同步块思想

从包含的代码量来说,同步代码块比同步方法小。我们可以把同步代码块比喻成是没上锁房间里的多了一层带锁的内门

带锁的内门可以由用户自定义其钥匙,你可以用本房的钥匙,你也可以指定用另一个房子的钥匙才能开,这样的话,你要跑到另一栋房子那儿把那个钥匙拿来,并用那个房子的钥匙来打开这个房子的带锁的内门

记住你获得的那另一栋房子的钥匙,并不影响其他人进入那栋房子没有锁的房间。

3. 同步方法与同步块的区别

解析到这里,很多读者好奇的问了,同步块存在的意义?
我猜想原因有下面几点:

  1. 对Java程序来讲同步的部分很影响运行效率,而一个方法通常是先创建一些局部变量,再对这些变量做一些操作,如运算,显示等等;而同步所覆盖的代码越多,对效率的影响就越严重。因此我们通常尽量缩小其影响范围。如何做?同步代码块。我们只把一个方法中该同步的地方同步,比如运算。
  2. 同步代码块可以指定钥匙这一特点有个额外的好处,是可以在一定时期内霸占某个对象的key。比如前面说过的一种特殊情况,这个人想进入某个房间之后,不想要等待,立马进入另一个房间,这时就可以采取这种做法。
  3. 当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。

当然,我们代码逻辑上有时会有这样的需求,在现实生活中对于公共的资源,暂时不用某个,可以先给他人用,可别采取同步块的做法哦。

简单总结:

其实同步方法和同步块都是锁的概念,不同的是同步方法是“外门”的锁,同步块是“内门”的锁,就好像我们去游乐场玩的时候排队一样,基本每个项目都是单个队列,但是中间有好几道栅栏。读者可以细细想想,其实我们说的同步方法和同步块的思想就在其中。

目录
相关文章
|
8月前
|
JSON 监控 API
唯品会商品详情接口(唯品会 API 系列)
唯品会商品详情接口助力电商发展,提供商品名称、价格、规格等详细信息,支持HTTP GET/POST请求,响应为JSON格式。开发者可通过API Key和商品ID获取数据,应用于电商数据分析、竞品调研、应用开发及价格监控,提升业务效率与竞争力。示例代码展示Python调用方法,方便快捷。
|
机器学习/深度学习 TensorFlow 算法框架/工具
TensorFlow中的自定义层与模型
【4月更文挑战第17天】本文介绍了如何在TensorFlow中创建自定义层和模型。自定义层通过继承`tf.keras.layers.Layer`,实现`__init__`, `build`和`call`方法。例如,一个简单的全连接层`CustomDenseLayer`示例展示了如何定义激活函数。自定义模型则继承自`tf.keras.Model`,在`__init__`中定义层,在`call`中实现前向传播。这两个功能使TensorFlow能应对特定需求和复杂网络结构,增强了其在深度学习应用中的灵活性。
|
JavaScript 前端开发
JavaScript 剪贴板 Clipboard 的那些事儿!
JavaScript 剪贴板 Clipboard 的那些事儿!
|
7天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
6天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
本文讲解 Prompt 基本概念与 10 个优化技巧,结合学术分析 AI 应用的需求分析、设计方案,介绍 Spring AI 中 ChatClient 及 Advisors 的使用。
316 130
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
|
18天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1331 8