在函数中通过类名同步是否在扩展类中有效?

2023-12-01

我在基类中有一个方法 foo 使用 Synchronized (类名) ,以及扩展基类的两个类 A 和 B 。如果我在两个不同的线程中从 A 实例和 B 实例调用 foo,它们会同步吗?这是一个示例代码:

class BaseClass { 
        void foo() {
        synchronized(BaseClass.class)   
            // do something like increment count 
        }   
    }


    class A extends BaseClass {
    }


    class B extends BaseClass {
    }

    A a = new A(); 
    B b = new B();
    //in thread 1
    a.foo() ; 
    //in thread 2
    b.foo() ;

是的,这将同步all的实例all类扩展BaseClass(包括BaseClass本身)。这BaseClass.class引用基本上是整个类加载器的单个引用。你真的想要那个吗?

Usually,当需要同步时,静态方法应该在静态的东西上同步,而实例方法应该在与实例相关的东西上同步。就我个人而言,我不喜欢同步this or a Class引用 - 由于这两个引用在其他地方都可用,因此其他代码可以在同一监视器上同步,从而很难推断同步。相反,我倾向于:

public class Foo {
    private final Object instanceLock = new Object();

    public void doSomething() {
        synchronized (instanceLock) {
            // Stuff
        }
    }
}

public class Bar {
    private static final Object staticLock = new Object();

    public static void doSomething() {
        synchronized (staticLock) {
            // Stuff
        }
    }
}

(我通常实际上只是使用lock作为名称;为了清楚起见,我只是在这里更明确地说明了这一点。)

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

在函数中通过类名同步是否在扩展类中有效? 的相关文章

随机推荐

  • 如何在 Angular 2 中包含 JQuery 插件?

    我在 Angular 2 项目中安装了 jquery 插件Link npm i jquery bootstrap scrolling tabs 并添加 angular cli json styles styles css node modu
  • 三元条件中的隐式转换问题[重复]

    这个问题在这里已经有答案了 可能的重复 条件运算符不能隐式转换 为什么 null 需要在这里进行显式类型转换 我进行了搜索 但没有找到关于为什么会发生以下情况的良好解释 我有两个具有共同接口的类 并且我尝试使用三元运算符初始化此接口类型的实
  • Prism 应用程序 CAL 中的菜单服务

    我正在尝试创建一个 Prism CAL 框架 这是我第一次涉足 CAL 但在设计用于注册某个区域的菜单项的服务时遇到困难 这是我到目前为止所想到的
  • C++ 中的就地构造函数是什么? [复制]

    这个问题在这里已经有答案了 可能的重复 C 的 放置新 C 中的就地构造函数是什么 e g Datatype x new y Datatype 这称为放置新运算符 它允许您提供将分配数据的内存 而无需new运算符分配它 例如 Foo f n
  • 如何将嵌套列添加到 DataFrame

    我有一个数据框df具有以下架构 root city name string nullable true person struct nullable true age long nullable true name string nulla
  • 工作日 jQuery UI 选项卡在当天打开

    我有如下工作日 jQuery UI 选项卡 我想在当前工作日打开它们 div ul li a href monday php Monday a li li a href tuesday php Tuesday a li li a href
  • iOS SwiftUI:以编程方式弹出或关闭视图

    我找不到任何关于制作方法的参考pop or a dismiss 以编程方式我用 SwiftUI 呈现的视图 在我看来 唯一的方法是使用模式中已经集成的滑动操作 如果我想禁用此功能 该怎么办 如何操作 以及导航堆栈的后退按钮 有谁知道解决方案
  • 动态调整 Iframe 的大小

    我可以看到这个问题已经被问过好几次了 但是所提出的解决方案似乎都不适合我正在构建的网站 所以我正在重新打开该线程 我正在尝试根据 iframe 内容的高度调整其大小 包含 iframe 的页面及其源页面都存在于同一域中 我已在以下每个线程中
  • ggplot:将图对齐并添加通用标签和图例

    我有一个data frame其中一个变量有多个级别 例如param1 param2and param3 所有这些水平具有相同的单位 浓度 mg L 1 但它们具有不同的值范围 例如 param1范围从0 to 0 4 param2范围从0
  • VB.NET - IIF(,) - 双方都被评估。哪些情况我应该注意?

    我最近了解了 IIF A B C 函数 我是一名资深 VB VB NET 编码员 最近花了很多时间来加快 SQL 编码速度 在 SQL 中要做的一件 明显的 常见事情如下 select case where var 0 then MyTab
  • CentOS 7 上的 Python3.5 的 Pygame

    先谢谢您的帮助 我正在尝试为 Python 3 5 安装 Pygame 我花了很多时间进行研究 发现 Windows 上可以 但 CentOS 上却没有 是否可以在 CentOS 7 上安装 Python 3 5 的 Pygame 如果是这
  • Gitolite 仅在注册了 SSH 的中央服务器上提示输入密码

    我正在运行 gitlab 它在中央存储库 Ubuntu 机器上使用 gitolite 并且有几个用户在通过 Gitlab 的 Web 界面添加公共 SSH 密钥后连接到这台机器 自己机器上的不同用户可以成功地从中央存储库机器上推送和拉取 在
  • 如何创建一个任务类型的新任务?

    I have async Task doWork Console WriteLine do some async work in this method Task task new Task doWork line X task Start
  • 在 Fragment 中使用 .getActivity( ) 后出现无法访问的语句

    我想在片段中使用 getSystemService 当我使用 getActivity 获取活动的上下文时 Android Studio 在同一行中告诉我这是一个 无法访问的语句 当我使用 getActivity 的行上方有一行时 它将显示顶
  • 如何在 Django 中计算和显示关联 ManyToMany 的对象

    我有一个包含新闻和类别的简单模型 class Category models Model name models CharField slug models SlugField class News models Model categor
  • QApplication 应用程序(argc, argv)

    我注意到main cpp in a Qt应用程序必须包含以下行 QApplication app argc argv 我知道argc是命令行参数的数量 并且argv是命令行参数的数组列表 但是 我心中的问题是 我传递给构造函数但同时无法显式
  • EclipseLink 的 CacheRetrieveMode.BYPASS 没有用

    按照我的代码 Company cc em find Company class clientUser getCompany getId System out println cc getCompany code HashMap findPr
  • C++ 中的 ThreadPool 库

    我正在寻找一个良好且稳定的 C 线程池库 该库有很好的文档记录 我了解本机 Windows 线程池 API 和较新的 Vista 线程池 API 但是我的程序需要一些向后兼容性 因此也许我可以为程序提供的外部库更好 我研究过 Boost 线
  • 何时应该使用 .empty 与单例空实例?

    在 Scala 中使用集合时 通常需要使用集合的空实例作为基本情况 因为默认的空实例使用类型参数扩展了集合类型类Nothing 有时直接使用它们会导致类型推断失败 例如 scala gt List 1 2 3 foldLeft Nil x
  • 在函数中通过类名同步是否在扩展类中有效?

    我在基类中有一个方法 foo 使用 Synchronized 类名 以及扩展基类的两个类 A 和 B 如果我在两个不同的线程中从 A 实例和 B 实例调用 foo 它们会同步吗 这是一个示例代码 class BaseClass void f