防止多个线程进入不同对象的相同方法

时间:2017-05-23 09:07:33

标签: java multithreading

如果您不想阅读整个故事,请跳至TLTR,但问题是:

我需要在我们的系统中修复一个错误,但我发现了这个错误,但找不到解决此问题的最佳解决方案。

作为一个例子,它的目标是做什么;当有三个要关闭的文件和每个文件时,会创建一个不同的线程(本例中为3个线程),并且应该获取文件的id,并使用文件的id,它应该关闭文件。

然而,编程这个的人并没有真正想到的东西。目前,为三个不同的文件创建了三个线程,并且它们同时访问分配id的方法,并且该方法给出了第一个文件的id(通常,第一个id到第一个线程,第二个id到应该给第三个线程的第二个线程和第三个id到三个线程,这三个线程试图关闭同一个文件(导致bug)。

我无法改变这种结构,它应该保持不变。

TLTR

我努力实现的目标是:如何防止多个线程同时进入同一个方法?

我为此尝试了同步(和锁定)策略但是在这种情况下它们没有帮助我,因为每个线程都有自己的锁(创建了几个对象)。

2 个答案:

答案 0 :(得分:3)

创建一个单身人士。

public static final Object globalLock = new Object();

然后在您需要保护的方法中。

synchronized(globalLock){
     //get your file ids.
}    

答案 1 :(得分:2)

这样做的方法有以下几种:

制作方法numbericString

synchronized

使用synchronized块:

    public class MyClass{
         public void synchronized mySynchronizedMethod(); // only single thread will be allowed to invoke this method on the SAME INSTANCE OF MyClass     

         public void notSynchronizedMethod();
    }

在课堂上同步

MyClass obj=new MyClass();
synchronized(obj){
  // only single thread is allowed to enter that block WITH obj INSTANCE.
      obj.notSynchronizedMethod(): 
}

使用MyClass obj=new MyClass(); synchronized(MyClass.class){ //single thread is allowed for this block in a scope of WHOLE CLASS LOADER so in most cases you can say it is "globally" synchronized }

Semaphore