我需要在我们的系统中修复一个错误,但我发现了这个错误,但找不到解决此问题的最佳解决方案。
作为一个例子,它的目标是做什么;当有三个要关闭的文件和每个文件时,会创建一个不同的线程(本例中为3个线程),并且应该获取文件的id,并使用文件的id,它应该关闭文件。
然而,编程这个的人并没有真正想到的东西。目前,为三个不同的文件创建了三个线程,并且它们同时访问分配id的方法,并且该方法给出了第一个文件的id(通常,第一个id到第一个线程,第二个id到应该给第三个线程的第二个线程和第三个id到三个线程,这三个线程试图关闭同一个文件(导致bug)。
我无法改变这种结构,它应该保持不变。
我努力实现的目标是:如何防止多个线程同时进入同一个方法?
我为此尝试了同步(和锁定)策略但是在这种情况下它们没有帮助我,因为每个线程都有自己的锁(创建了几个对象)。
答案 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