Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >为什么在lock语句中指定同步对象是强制性的?

为什么在lock语句中指定同步对象是强制性的?
EN

Stack Overflow用户
提问于 2012-12-29 13:05:36
回答 4查看 527关注 0票数 3

我正试图把我的注意力集中在锁语句中到底发生了什么。

如果我没听错的话,lock语句是语法糖,下面是.

代码语言:javascript
代码运行次数:0
复制
Object _lock = new Object();

lock (_lock)
{
    // Critical code section
}

...gets被翻译成大致类似于:

代码语言:javascript
代码运行次数:0
复制
Object _lock = new Object();

Monitor.Enter(_lock);
try
{
    // Critical code section
}
finally { Monitor.Exit (_lock); }

我已经使用了几次lock语句,并且总是创建一个私有字段_lock,作为一个专用的同步对象。我理解为什么不应该锁定公共变量或类型。

但是为什么编译器不同时创建这个实例字段呢?实际上,我觉得可能会出现开发人员想要指定锁定什么的情况,但根据我的经验,在大多数情况下,完全没有兴趣的情况下,您只是想要锁!那么为什么没有无参数的锁过载呢?

代码语言:javascript
代码运行次数:0
复制
lock()
{
   // First critical code section
}

lock()
{
   // Second critical code section
}

将被翻译成(或类似):

代码语言:javascript
代码运行次数:0
复制
[DebuggerHidden]
private readonly object _lock1 = new object()

[DebuggerHidden]
private readonly object _lock2 = new object()

Monitor.Enter(_lock1);
try
{
    // First critical code section
}
finally { Monitor.Exit(_lock1); }

Monitor.Enter(_lock2);
try
{
    // Second critical code section
}
finally { Monitor.Exit(_lock2); }

编辑:我显然对多个锁语句不太清楚。更新问题以包含两个锁语句。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-31 18:27:27

为了让这个没有变化的东西起作用,你必须:

  • 每个锁块有一个自动生成的锁变量(这意味着不能有两个不同的锁块锁定在同一个变量上)
  • 对同一个类中的所有锁块使用相同的锁变量(这意味着不能保护两个独立的东西)

另外,您还需要确定应该是实例级的还是静态的。

最后,我猜想语言设计人员并不认为在特定情况下的简化是值得在阅读代码时引入歧义的。线程代码(这是使用锁的原因)已经很难正确地编写和验证。让事情变得更困难不是件好事。

票数 1
EN

Stack Overflow用户

发布于 2012-12-29 13:07:46

需要存储锁的状态。不管它是否被输入。这样,尝试进入同一锁的另一个线程就可以被阻塞。

这需要一个变量。只是一个非常简单的东西,一个普通的物体就足够了。

这样一个变量的一个困难要求是在任何lock语句使用它之前创建它。尝试按您的提议动态创建它会产生一个新的问题,现在需要使用锁来安全地创建变量,以便只有进入锁的第一个线程创建它,而其他试图进入锁的线程被阻塞,直到它被创建。这需要一个变量。等等,一个无法解决的鸡与蛋问题。

票数 3
EN

Stack Overflow用户

发布于 2012-12-29 13:15:19

在某些情况下,您需要两种不同的lock,它们是相互独立的。这意味着当代码的一个“可锁”部分被锁定时,另一个“可锁定”不应该被锁定。这就是为什么能够提供锁对象的原因--您可以为几个独立的lock提供其中的几个。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14085924

复制
相关文章
Flutter 解耦
uncoupling使用了标记的方式,直接操作文件代码以实现代码物理方式的灵活插入与抽取,对工程没有任何侵入性,简单易用。
花落花相惜
2021/12/15
6030
Redis 应用实践-消息队列-解耦系统组件
Redis作为消息队列的应用场景之二是解耦系统组件。例如,当一个系统由多个组件组成时,每个组件都可以将消息推送到Redis队列中,而其他组件可以订阅这些队列以获取消息。这样,系统组件之间的通信变得简单而高效。
玖叁叁
2023/04/15
2710
装饰者解耦的秘诀
[译] 如何创建高度模块化的 Android 应用里面讲解了装饰者做组合的问题。更多的是使用方法,我们需要站在他的肩膀上去思考这个问题,并做知识的内化。
jerrypxiao
2020/04/08
9470
同学,请专业点,用Hooks解耦UI组件吧
怎么可能,让我们将数据请求部分抽离为一个自定义hook——useSomeData。
公众号@魔术师卡颂
2020/12/11
6730
同学,请专业点,用Hooks解耦UI组件吧
使用上下游思维实现系统解耦
在软件开发领域,解耦这个词相信大家都不陌生。在面向对象的语境下,我们会应用SOLID原则来构建高内聚低耦合的应用,实现模块间的解耦;在复杂业务系统分析和建模时,会通过DDD的战略和战术设计帮助划分领域并实现分布式系统中服务的解耦;当我们在组织大型敏捷开发团队协同工作时,通过组建自治团队来减少摩擦,从而实现团队级别的解耦。 可以看到解耦无处不在,并且以此为目的投入,大家都会觉得是无比的政治正确,因为实现了解耦,我们的系统和应用就能更快速的扩展和演进,我们的团队就能更顺畅的合作并能更加快速的实现业务价值。 但是
ThoughtWorks
2022/09/02
5680
使用上下游思维实现系统解耦
SIGIR2023 | 推荐系统中的解耦对比学习
TLDR: 我们将意图解耦的思想与自动化的对比学习相结合,通过学习包含全局信号的解耦意图特征和自适应的图掩码增强模块,来提供有效的自监督信号,以提高推荐算法的性能。
张小磊
2023/08/22
1K0
SIGIR2023 | 推荐系统中的解耦对比学习
框架解耦神器 -- REventBus
在实际的项目开发中,经常会遇到业务与业务,组件与组件,业务与组件之间的通信,举个例子:当有烟雾传感器检测到烟雾超标时,需要打开排气扇排气,同时显示烟雾浓度显示到显示器中,供管理人员检视。处理这样的逻辑有几种策略。如下:
Rice加饭
2023/06/01
2900
框架解耦神器 -- REventBus
框架解耦神器 -- REventBus
在实际的项目开发中,经常会遇到业务与业务,组件与组件,业务与组件之间的通信,举个例子:当有烟雾传感器检测到烟雾超标时,需要打开排气扇排气,同时显示烟雾浓度显示到显示器中,供管理人员检视。处理这样的逻辑有几种策略。如下:
Rice加饭
2023/09/02
2130
框架解耦神器 -- REventBus
【Jetpack】Lifecycle 架构组件 ( 系统组件与普通组件解耦 | Lifecycle 解耦系统组件与普通组件 | 解耦服务组件与普通组件 | 监听应用程序生命周期 )
在 Android 应用开发过程中 , 普通组件 如 UI 控件 , 需要 与 Android 组件 的 生命周期函数相关联 , 当 Android 组件生命周期 发生改变时 , 可以 通知 普通组件 执行某种操作 ;
韩曙亮
2023/03/30
9110
【Jetpack】Lifecycle 架构组件 ( 系统组件与普通组件解耦 | Lifecycle 解耦系统组件与普通组件 | 解耦服务组件与普通组件 | 监听应用程序生命周期 )
使用IOC解耦React组件
除了DI外,另一种实现方式是Dependency Lookup(依赖查找),简称DL。
公众号@魔术师卡颂
2021/03/15
9170
巧用NULL模式解耦依赖
由于需求的变化,应用B需要库libM.a的能力,以便和服务M交互。为了复用和简化,通过类A间接提供,应用B不用修改代码,只需要重新编译即可获得新的能力,其它用到类A的应用也是如此。
一见
2018/09/30
5300
巧用NULL模式解耦依赖
解耦重构 Internet BGP SDN
高清视频直播和云计算的蓬勃发展,带来互联网流量持续高速增长,主流云公司的Internet出口带宽都已经达到Tbps级别。 鉴于网络的拥堵大部分发生在出口互联,Edge Peering Fabric的架构设计直接影响到终端客户的用户体验, 2017年Google/Facebook对外发布了两种不同的Edge 设计理念,本文试着以Google Espresso为主详解下一代Cloud Edge的架构,并简单介绍一下Facebook Edge Fabric。
SDNLAB
2018/10/24
2.1K0
解耦重构 Internet BGP SDN
产品经理 | 什么是解耦?
在理解解耦之前,我们先来理解耦合度。耦合度是软件工程领域的概念,是指模块之间的依赖程度。
产品的技术小课
2022/09/02
3.4K0
一行代码快速解耦Application逻辑,让Application更简洁好维护
版权声明:本文为博主原创文章,未经博主允许不得转载。https://www.jianshu.com/p/23b9ba9b685d
AWeiLoveAndroid
2018/09/03
3280
一行代码快速解耦Application逻辑,让Application更简洁好维护
MultiVelo推断动态解耦的基因调控
单细胞多组学数据旨在相同细胞中捕获细胞多分子模式,提供了探索细胞表观基因组和转录组关系的机会。作者开发了MultiVelo,这是一种基因表达的机制模型。它纳入表观基因组数据的同时扩展了RNA速率框架。MultiVelo使用概率隐变量模型从单细胞数据估计染色质可及性和基因表达的转换时间和速率参数,提供表观基因组和转录组变化之间时间关系的定量总结。与仅从RNA估算的方法相比,结合染色质可及性数据显著提高了细胞命运预测的准确性。在来自大脑、皮肤和血细胞的单细胞多组学数据集上拟合MultiVelo揭示了两类不同的基因。该模型还确定了四种细胞状态——表观基因组和转录组耦合的两种状态和两种不同的解耦状态。MultiVelo推断的参数量化了基因占据四种状态的时间长度,根据转录组和表观基因组之间的耦合程度对基因进行排序。最后,作者确定了转录因子表达和结合位点可及性之间以及疾病相关SNP可及性和连锁基因表达之间的时滞。
DrugAI
2022/01/13
7540
MultiVelo推断动态解耦的基因调控
编程思想 定义过滤的方式解耦
本文将会很少涉及 dotnet 的知识,主要讲用定义过滤的方式解除过程业务的耦合。在一些业务上,可以从业务层面或逻辑层面明显分为几层,每一层之前的数据相互依赖或处理顺序相互依赖,但逻辑都独立。此时如果将业务处理放在过程处理里面,将会让过程处理耦合具体业务。而定义过滤的方式为让过程逻辑只是搭建框架为主,具体业务通过注入过滤的形式加入到处理
林德熙
2020/03/12
5320
复杂任务中,流程的解耦设计
在系统开发的过程中,必然存在耗时极高的动作,是基于请求响应模式无法解决的问题,通常会采用解耦的思维,并基于异步或者事件驱动的方式去调度整个流程的完整执行;
知了一笑
2022/06/14
1.2K0
复杂任务中,流程的解耦设计
模块解耦的三种方案
URLRouter:将不同的模块定义成为不同的URL,通过URL的形式进行跨模块调用。
Helloted
2022/06/08
1.4K0
模块解耦的三种方案
业务解耦-事件监听模式的使用
事件监听机制有点类似于sub/pub模式,不过这个技术点也仅适用于单体应用的范围,分布式应用还是老老实实使用消息队列来进行吧。
码农王同学
2020/03/25
4420
模块化与解耦(转)
本文主要讲述了在iOS开发过程中,模块化工程架构的一种组织方式,本文主要讲述基于cocoapods来做模块化的方案,详细讲述了iOS开发怎么进行模块划分的内容,主要会在以下方面做阐述:
VV木公子
2018/06/05
7.5K0

相似问题

数据库设计解耦

51

数据库表-去解耦还是不解耦?

11

真正的数据库代码解耦

10

一个完全解耦的OO系统?

30

解耦OOP

69
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文