当前位置: 首页 > 面试题库 >

何时在Java中使用同步

翁翰
2023-03-14
问题内容

我希望这将是足够的信息,所以就在这里。如果您需要更多信息,请在评论中了解。

我有一班有两个内部班。内部类每个都有两个方法来调用外部类中的方法。因此,它看起来像这样:

public OuterClass {
    private boolean outerMethodHasBeenCalled = false;

    private void outerMethod() {
        if(!outerMethodHasBeenCalled) {
            // do stuff
        }

        outerMethodHasBeenCalled = true;
    }

    private FirstInnerClass {
        public void someMethod() {
            outerMethod();
        }
    }

    private SecondInnerClass {
        public void someOtherMethod() {
            outerMethod();
        }
    }
}

重要的是要注意:

  • 这是针对Android应用的。的实例FirstInnerClass,并SecondInnerClass传递给作为网页视图一个JavaScript接口,所以someMethodsomeOtherMethod可以随时调用,没有特定的顺序。
  • 目前,我在使用现有代码(不使用synced关键字)时遇到了一个问题,该问题outerMethod在同一时间(我打印出一条日志消息,并且将它们的时间戳记为1000秒)几乎在同一时间被调用。然后,我的应用“执行操作”两次,因为调用outerMethodHasBeenCalled时它仍然为假outerMethod。这不行,这正是我要防止的事情。我的应用程序只能“执行一次操作”一次,也只能一次:第一次outerMethod调用。
  • 听起来好像我有多个实例OuterClass,但请放心,它只是的一个实例OuterClass

重要的是,只有在第一次outerMethod调用我的应用程序时,它才能“执行操作”
(我希望这现在很明显)。基本上所有后续调用都将被忽略。哪个内部类outerMethod首先调用-没关系。

那么,在这种情况下使用synced关键字是否合适?


问题答案:

是的,鉴于您上面已列出的内容,我会考虑:

private synchronized void outerMethod() {
...
}

请注意,这将具有阻塞调用者之一,直到externalMethod()完成之前的副作用。如果可以接受,请冷却。如果目的只是让outerMethod()中的代码运行一次,
并且 如果第一个调用者正在运行outerMethod(),则第二个调用者不被延迟是可以的,则可以考虑:

public OuterClass {
    private AtomicBoolean outerMethodHasBeenCalled = new AtomicBoolean();

    private void outerMethod() {
        if (outerMethodHasBeenCalled.compareAndSet(false, true)) {
            // do stuff
        }
    }
...

请参阅JavaDoc for
AtomicBoolean
来了解发生了什么(假设它在Android的Java中可用)。



 类似资料:
  • 问题内容: StringBuilder在Java中,通常最好使用a 进行字符串连接。总是这样吗? 我的意思是:创建对象,调用方法并最终已经很小,然后将现有字符串与+运算符连接成两个字符串的开销是小的,还是建议仅用于两个以上的字符串? 如果有这样的阈值,它取决于什么(也许是字符串长度,但以哪种方式)? 最后,你是否会以+级联的可读性和简洁性为代价,以较小的情况(例如两个,三个或四个字符串)的性能为代

  • 问题内容: 在上面的示例中,我有几个问题。 何时使用冲洗方法,为什么要使用它? 封闭方法在这里得分如何? …如果我错了,请纠正我,我正在读取文件对象并将其存储到另一个对象中,并对该文件对象进行类型转换。 序列化或将数据持久保存在Java中有哪些选择。我不希望数据以字节流的形式进入文件。 问题答案: 何时使用冲洗方法,为什么要使用它? 它将冲洗仍由缓冲的所有内容。JavaDoc中提供了详细描述。 封

  • 我有一个Employee类,它有如下3个字段。 为此,我希望根据员工姓名(empName)排序,如果多个员工的姓名相同,则根据员工id(empId)排序。 为此,我编写了一个自定义比较器,使用java.util.比较器如下所示。 我已经创建了8个Employee对象并添加到ArrayList中,如下所示。 并使用上述比较器对列表进行如下排序。 它工作得非常好。但这可以使用类似的方法来完成,如下所示

  • 问题内容: 我在这里遇到了一个很大的问题,我认为这是因为我不太了解如何使用Java提供的API。 我需要写一个和一个到一个 我想到了使用a 来解决用和编写的数据,并且能够将其放入字节数组中,我应该使用method 我知道此类使用Wrapper模式,所以我有两个选择: 要么 但在两种情况下,我都“松散”了一种方法。在第一种情况下,我无法访问该方法,在第二种情况下,我无法访问该方法。 我应该如何一起使

  • 我正在编写一个 Java 应用程序以将数据从 Oracle 导出到 csv 文件 但行上的某些数据可能如下所示:

  • 问题内容: 在什么情况下,枚举比保证唯一元素的Collection(例如,java.util.Set的实现者)更合适? (这是我上一个问题的跟进) 问题答案: 基本上是在编译时就知道的一组定义明确的固定值。 您可以很容易地将枚举用作集合(通过EnumSet),它允许您定义行为,按名称引用元素,打开元素等。