如果一个同步方法调用另一个非同步方法,该非同步方法是否有锁

2024-02-09

在Java中,如果一个同步方法包含对非同步方法的调用,那么另一个方法是否仍然可以同时访问该非同步方法?基本上我要问的是同步方法中的所有内容都有锁(包括对其他同步方法的调用)?


如果一个同步方法调用另一个非同步方法,该非同步方法是否有锁

答案取决于上下文。

如果您处于synchronized对象的方法,然后由其他线程调用同一对象实例的其他方法,这些方法也是synchronized被锁定。然而,其他线程对非同步方法的调用是not锁定 – 任何人都可以同时呼叫他们。

public synchronized void someSynchronizedMethod() {
    ...
    someNonSynchronizedMethod();
    ...
}

// anyone can call this method even if the someSynchronizedMethod() method has
// been called and the lock has been locked
public void someNonSynchronizedMethod() {
   ...
}

另外,如果您致电someSynchronizedMethod()但恰好在someNonSynchronizedMethod()方法,你仍然持有锁。当您进入同步方法(或块)时,锁定将启用,而当您退出该方法时,锁定将被禁用。您可以调用各种其他非同步方法,它们仍然会被锁定。

但你在问题中问了两个不同的事情:

在Java中,如果一个同步方法包含对非同步方法的调用,那么另一个方法是否仍然可以同时访问该非同步方法?

是的。其他方法可以访问非同步方法。

基本上我要问的是同步方法中的所有内容都有锁(包括对其他同步方法的调用)?

呃,是的。其他电话至同步的方法被锁定。但非同步方法不会被锁定。

另外,请记住,如果该方法是static那么锁就在Class对象在ClassLoader.

// this locks on the Class object in the ClassLoader
public static synchronized void someStaticMethod() {

如果该方法是实例方法,则锁位于类的实例上。

// this locks on the instance object that contains the method
public synchronized void someInstanceMethod() {

这两种情况下有两种不同的锁。

最后,当你处理synchronized实例方法,每个instance类的内容是被锁定的。这意味着两个线程可以在同一个线程中synchronized同时采用不同的方法实例。但是如果有 2 个线程尝试操作synchronized同一实例上的方法,一个将阻塞,直到另一个退出该方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果一个同步方法调用另一个非同步方法,该非同步方法是否有锁 的相关文章

随机推荐

  • 导航抽屉项目未注册点击事件

    我正在努力让导航抽屉项目注册并启动并意图进行新活动 抽屉打开正常并正确显示 但当我单击列表中的项目时没有任何反应 这是我的代码 取自谷歌教程 mTitle mDrawerTitle getTitle mTitles getResources
  • 快速将大型 2d 矩阵融合为 3 列 data.table

    我有一个大矩阵num 1 62410 1 48010 我想要一个长格式的 data table e g Var1 Var2 value 1 1 1 4227 786 2 2 1 4211 908 3 3 1 4197 034 4 4 1 4
  • Javascript 按空格分隔,但不按引号分隔

    目标是在空格处分割字符串 但不分割引号中的文本数据或将其与相邻文本分开 输入实际上是一个包含值对列表的字符串 如果 value 值包含空格 则将其括在引号中 我需要一个返回值对元素数组的函数 如下例所示 输入示例 a 0 b 1 moo f
  • 使用 UCLIBC 交叉编译 PHP

    这是一个转发 之前的帖子已关闭 移至 SERVERFAULT 并再次关闭 我认为这篇文章是一个有效的堆栈溢出问题 因为我认为它是由一些 automake 编译 链接错误引起的 这是一个编程问题而不是服务器管理问题 我会检查 uClibc 的
  • Monogame:WAV 无法播放

    这是 MonoGame 3 4 我通过 VS2013 使用它 我正在使用 mgcb 编译我的 WAV 文件 就像我的纹理一样 MGCB 工作正常 但是当涉及到使用SoundEffect类 它不播放任何内容 没有例外并且SoundEffect
  • CKEDITOR,在文本编辑器 onLoad 上自动聚焦

    有人知道如何在页面加载时自动聚焦于 CKEDITOR 文本区域吗 目前 用户必须先单击文本区域才能开始输入 像 Google 一样 我希望加载页面 并且用户可以立即开始输入 而无需单击文本区域 这是启动 CKEDITOR 的当前代码
  • webRTC - 视频导致互联网上的通话中断

    更新1 我尝试像这样改变视频约束 var mediaConstraints audio true We want an audio track video width min 160 ideal 320 max 640 height min
  • 浏览器使用哪种等宽字体?

    对于 CSS 如果您指定font family monospace 我的理解是浏览器选择其默认 首选等宽字体 如果这是正确的 您如何确定您的浏览器正在使用哪种等宽字体 可以使用 5 个通用系列 serif sans serif cursiv
  • 在 Notepad++ 中显示不匹配的 html 标签

    有没有办法在 Notepad 中突出显示不匹配的 HTML 标签 例如 如果我有以下 HTML 我想要标签以某种方式突出显
  • 由于一个或多个外键属性不可为空,因此无法更改该关系

    使用 EF 更新期间出现以下错误 操作失败 无法更改关系 因为一个或多个外键属性不可为空 当关系发生更改时 相关的外键属性将设置为空值 如果外键不支持空值 则必须定义新关系 必须为外键属性分配另一个非空值 或者必须删除不相关的对象 有没有g
  • Codeigniter 论坛集成

    我想将一个简单的论坛与 Codeigniter 应用程序集成 想知道是否有人有任何建议 干杯 Laurence 我会看一下普通论坛 有很多插件 开源 而且很容易集成 即 Codeigniter http vanillaforums org
  • 以编程方式设置 UIView 的自动调整大小掩码?

    我必须以编程方式设置 autoresizingMaskUIView 我不知道如何实现这个 要实现屏幕截图中的效果 您需要执行与 DrummerB 建议相反的操作 你想要一个固定的上边距 这样你就可以让其他每一面都变得灵活 如下所示 目标C
  • 指定 Python argparse 输入参数的日期格式

    我有一个需要一些命令行输入的 Python 脚本 我正在使用argparse用于解析它们 我发现文档有点混乱 找不到检查输入参数格式的方法 我通过以下示例脚本解释了检查格式的含义 parser add argument s startdat
  • 如何在 Scala 代码中读取压缩的 xml 文件?

    如何直接从 Scala 程序中的压缩文件访问 XML 数据文件 有没有直接的方法可以以编程方式解压缩并读取 Scala 代码中的内容 以下是 2 8 1 中执行此操作的几种方法 cat gt root xml lt lt EOF
  • 如何在具有 API 7 的 Android 应用程序中使用 NumberPicker?

    我的应用程序的最小 sdk 是 7 但我可以使用 sdk 版本 11 中的 DialogFragment 因为它位于我的 lib 目录中的支持库中 我想做这样的例子 http developer android com guide topi
  • 如何防止 IE 中的 javascript: href 链接触发 window.onbeforeunload ?

    我正在为我的表单构建一个故障安全机制 它将警告用户 如果他们离开页面 他们的表单数据将会丢失 类似于 gmail 的做法 window onbeforeunload function if formIsDirty return You ha
  • 从直方图曲线中选择最佳值范围

    设想 我正在尝试跟踪两个不同颜色的物体 一开始 系统会提示用户将第一个彩色对象 例如 可能是红色 放在相机前面的特定位置 在屏幕上用矩形标记 并按任意键 然后我的程序将获取帧的该部分 ROI 并分析其中的颜色 找到要跟踪的颜色 对于第二个对
  • Edge chromium 不会显示基本身份验证弹出窗口?

    我有一个 Apache 服务器 v2 4 43 为我的网站提供服务 并且我使用一个简单的 htpasswd 我使用指令 AuthUserFile 在 htaccess 中调用它来进行身份验证 现在 该解决方案适用于所有浏览器 将显示一个弹出
  • 应用程序内的 Dropbox 身份验证

    有什么方法可以在 iPhone 中的 Dropbox 应用程序中对用户进行身份验证吗 I using Dropbox IOS https www dropbox com developers start authentication ios
  • 如果一个同步方法调用另一个非同步方法,该非同步方法是否有锁

    在Java中 如果一个同步方法包含对非同步方法的调用 那么另一个方法是否仍然可以同时访问该非同步方法 基本上我要问的是同步方法中的所有内容都有锁 包括对其他同步方法的调用 如果一个同步方法调用另一个非同步方法 该非同步方法是否有锁 答案取决