当前位置: 首页 > 知识库问答 >
问题:

为什么通过最终访问器访问“AbstractOwnableSynchronizer#exclusiveOwnerThread”?

卫兴邦
2023-03-14

以下是JDK11的源代码:

package java.util.concurrent.locks;
public abstract class AbstractOwnableSynchronizer implements java.io.Serializable {
    private transient Thread exclusiveOwnerThread;
    protected final void setExclusiveOwnerThread(Thread thread) {
        exclusiveOwnerThread = thread;
    }
    protected final Thread getExclusiveOwnerThread() {
        return exclusiveOwnerThread;
    }
}

使用访问器而不是直接使用字段有什么意义?既然访问器方法是最终的,为什么不声明:protected瞬态Thread excsiveOwnerThread;并删除访问器呢?

共有1个答案

邵文乐
2023-03-14

我可以想到几个可能的原因:

>

  • 未来打样。如果他们将来想在getter和setter中加入一些逻辑,这允许他们这样做。

    可能的向后兼容性1。也许是那个能手和二传手

    现在更改类(如您建议的那样)可能会破坏客户代码的兼容性。

    我希望代码作者(DougLea)选择在这里使用getter和setter,因为他认为这是正确的方法。一般来说,抽象边界越强,不必要的耦合问题就越少。

    在这里使用getter/setter不太可能有任何真正的缺点。例如,对getter和setter代码的调用可能由即时编译器内联。

    1-在这种情况下不是。该类是在Java6中引入的,从那时起就没有更改过

  •  类似资料:
    • 我已经阅读了许多关于堆栈溢出的文章,试图找出为什么下面的代码1不起作用,但代码2起作用。我发现在6版和7版的不同版本中,行为或编译器存在不一致性https://stackoverflow.com/questions/13864464/use-of-uninitialized-final-field-with-without-this-qualifier.这更多地涉及访问默认的最终变量,无论是否有“

    • 问题内容: 我正在寻找一种在Java App(使用JDBC)中打开Access MDB文件的方法。 快速的Google搜索建议我为此需要JDBC-ODBC Bridge。 这是否意味着我需要配置要在其上运行应用程序的每个系统,以便为要打开的MDB提供ODBC DSN? 还有一个问题(因为我以前从未使用过ODBC):通信是通过某种套接字(以客户机/服务器方式)还是通过方法/函数调用(例如嵌入Derb

    • 问题内容: 我了解为什么编译器不接受以下内容: 让我感到困惑的是,编译器接受以下内容,并且单元测试通过了: 为什么上述方法有效并且可以正常工作?欢迎使用指向JLS相关部分的指针(15.27.2节仅讨论局部变量)。 问题答案: 我们都同意第一个例子不能用,因为局部变量或参数必须是最终的或有效的最终才能在lambda表达式主体中使用。 但是您的第二个示例不涉及局部变量或参数,而是实例字段。Lambda

    • 问题内容: 在这里只能是最终的。为什么?如何在不保留为私有成员的情况下重新分配方法? 单击该如何返回?我的意思是, 问题答案: 如注释中所述,其中一些在Java 8中变得无关紧要,在Java 8中final可以隐式使用。但是,只能在匿名内部类或lambda表达式中使用有效的最终变量。 这基本上是由于Java管理闭包的方式。 创建匿名内部类的实例时,该类中使用的任何变量都将通过自动生成的构造函数复制

    • 因此,我已经成功地从注册表下载并运行了dockerfile/nginx映像。我现在如何通过在其上启动bash终端来访问其文件系统? 也许我在概念上遗漏了一些东西。我需要ssh进入它吗?谢谢

    • 问题内容: 我有一个页面,该页面向中的URL 发出JSONP ajax请求(使用jQuery的功能)。我以为(阅读:假定),其中的资源可以在服务器端访问该域中设置的任何cookie,但事实并非如此? 专门执行ajax调用以访问特定的cookie,进行一些数据操作并返回以cookie值为键的丰富信息集。原始域无法直接访问cookie值,因此我认为ajax请求将保持我需要的状态。 我会忽略关于Cook