2013-06-19 73 views
2

我正面临有关Java方法同步的问题。让我们希望我可以简单地解释它:在不同的类(和不同的包)中同步两种方法

我有两个不同的方法在两个不同的类,在两个不同的包。喜欢的东西:

Package1 
    |_Class1 
      \MethodA 

Package2 
    |_Class2 
      \MethodB 

好了,现在我需要这两种方法,这是不是线程同步。到目前为止,我有两种不同的方法:

共享信号量

Package1Package2创建一个共享的静态信号,是这样的:

package Package3; 

public class SemaphoreClass { 

    public static Semaphore; 

} 

我真的不知道,如果JVM会认为这是一个共享的信号,无论如何。

Synchronized(SharedClass.class)

使用共享类这两种方法实现同步,是这样的:

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

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

不管怎样,这些都只是接近。我想听听实现我想实现的最佳方式是什么。拥有JVM的共享信号会让事情变得更容易,但是,我知道必须有解决方案。提前致谢。

+3

信号量解决方案是好的......但是不要忘记在'finally'块中释放它! – fge

+0

事实上,类在不同的包中是不相关的,你可以按照同步一个类的实例的方式同步它的实例。 – SJuan76

+1

@ SJuan76我知道这不是真的相关,所以我把它们放在“()”里面;) –

回答

3

你的两种方法都应该可以工作,但我不认为锁定类是推荐的做法。优先锁定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)Class1Class2的客户端必须通过正确的锁定。 Class1Class2的客户端充当“协调者”。