1
使用synchronized塊,我有以下的代碼片段:在ExecutorService的
public class Service<T> {
private ConcurrentMap<Integer, Integer> locks = new ConcurrentHashMap<Integer, Integer>();
public final ExecutorService exec = Executors.newFixedThreadPool(5);
public Future<Boolean> foo(T o, String fileName) throws IOException {
return exec.submit(new Callable<Boolean>() {
@Override
public Boolean call() throws IOException {
File f = new File(fileName);
// synchronized (getCacheSyncObject(name.hashCode())) {
// try (OutputStream out = new FileOutputStream(f)) {
// //some actions
// }
// }
try (OutputStream out = new FileOutputStream(f)) {
//some actions
}
return true;
}
});
}
private Object getCacheSyncObject(final Integer id) {
locks.putIfAbsent(id, id);
return locks.get(id);
}
}
public class Main {
public static void main(String[] args) throws IOException {
Object obj = new Object();
Service<Object> service = new Service<>();
Future<Boolean> result1 = service.foo(obj, "filename"); // is there a deadlock?
service.exec.shutdown();
}
}
我想完成一個簡單的任務。我需要一個獨佔的文件鎖定。爲了得到這個,我把文件的文件名鎖定到同步塊。但在這種情況下,我從foo
方法中沒有得到任何東西。我的程序沒有結束。
該程序將創建大約與它在其生命週期中讀取的不同文件數量一樣多的鎖。 (或者,如果它運行的時間很長,鎖的數量將漸近地接近2^32)這可能不是你想要的。如果我打算將文件映射到鎖,我將擁有一個較小的鎖池 - 可能會有一些小的倍數(2倍或3倍)的文件數量,我希望它們可以同時打開。 –
您可以根據給定路徑名的散列值選擇一個鎖,但可能會有多個不同的路徑名引用同一個文件。 –
你說過,「我需要獨佔文件鎖定。」大多數看到「文件鎖定」字樣的程序員會認爲你想防止兩個或多個_processes_同時訪問同一個文件。如果您僅嘗試同步兩個或多個_threads的活動,則可能希望避免說「文件鎖定」._ –