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

同步不同类(和不同包)中的两个方法

劳嘉实
2023-03-14
问题内容

我面临有关Java方法同步的问题。希望我能简要解释一下:

我在两个不同的类中,在两个不同的包中有两个不同的方法。就像是:

Package1
     |_Class1
            \MethodA

Package2
     |_Class2
            \MethodB

好的,所以现在我需要同步这两个 不是thread的方法 。到目前为止,我有两种不同的方法:

共享信号量

Package1和外部创建一个共享的静态信号量Package2,例如:

 package Package3;

 public class SemaphoreClass {

    public static Semaphore;

}

无论如何,我真的不知道JVM是否会将其视为共享信号量。

已同步(SharedClass.class)

使用共享类同步这两个方法,例如:

 public void MethodA() {
        synchronized (SharedClass.class) {
           //...
        }

public void MethodB() {
        synchronized (SharedClass.class) {
           //...
        }

无论如何,这些只是方法。我想听听什么是实现我想要实现的最佳方法。具有JVM的共享信号量会使事情变得更容易,但是,我知道必须为此提供解决方案。提前致谢。


问题答案:

您的两种方法都应该有效,但是我不认为锁定类是推荐的做法。最好锁定的实例Object,或使用适当的锁定java.util。另外,请勿锁定String

或者,你可以让类的实例Class1Class2实例化过程中可以采取锁定为参数:

   class Class1 {
        private final Object lock;
        public Class1( Object lock ) { this.lock = lock }
        public method() { synchronize( lock ) { } );
   }

然后确保你创建 一个 锁(含new Object()),并把它传递给的两个实例Class1Class2

因此,基本上,您将原始问题分解为两个部分:1)两个类不共享任何全局静态的东西,它们只接收一个参数。2)的客户端Class1,并Class2必须通过正确的锁。的客户,Class1Class2充当“协调者”。



 类似资料:
  • 我在阅读oracle的多线程官方教程时,遇到了这个例子(假设< code>c1和< code>c2从未一起使用): 据说通过使用锁1 然而,我并不认为这有助于减少阻塞,因为它们彼此之间没有依赖关系。我有多个线程同时运行这两个方法,当我使用lock对象和this关键字时,性能非常相似。 有人可以帮助解释我的困惑吗?喜欢用一个例子来说明差异。 除了这里的讨论,这篇文章也帮助澄清了我的疑虑。要点:将sy

  • 我试图设置两个线程,它们在另一个类中增加或减少一个整数。我对这个属性的同步有一些问题。 这是我的主要类,我在其中设置了线程和计数器类: 这是我的柜台课: 这是我的Thread1类:(runnable类是一样的,只是用“实现Runnable”而不是“扩展线程”) 但是,我的输出始终是10000000。尽管我同步了两种方法。有人能解释这是怎么回事吗?

  • 假设我们有两个类A、B和各自类的同步方法methodA、methodB。如果我们从synchronizedmethodA调用synchronized methodB,那么当methodB仍在执行时,线程是否仍对ObjectA保持锁定?

  • 我使用一个Android库,它要求我创建两个类,每个类继承自不同的类 (具有公共基类) 现在我有这个代码: 我必须复制这个类来创建一个扩展,即使我的两个类共享完全相同的代码。 我简化了示例的代码,但重复可能很重要 我决定将代码放在这两个类之外的静态方法中,并在类重写的方法中调用它们,但我认为必须有一种更干净的方法来做到这一点。 你能帮我解决这个问题吗? 和都继承自。

  • 我在Java中有两个几乎相同的方法。唯一的区别是它们有不同的参数类型。它们使用泛型并返回输入参数的类型T。我怎样才能摆脱重复的代码?下面是我的两个方法。最后,它们都使用不同的类型调用Spring。否则,方法是相同的。

  • 我有两个类,它们具有相同的类名并使用相同的包名。但是,这两个类文件位于不同的目录中。这两个类之间的另一个不同之处是,每个类中都有其他类中没有的方法。本质上,我想将这些方法拆分为两个使用相同名称但不同文件夹的单独文件。 理论上,我认为这是可能的,因为Java编译器在构建输出时确实维护了目录结构。所以在运行时,如果在类中调用了一个方法,Java可能会在任何一个文件中找到该方法。 这可能吗?我使用的是I