Я использую jface ProgressMonitorDialog для кэширования некоторых данных. Это делается в синхронизированном блоке, чтобы не столкнуться с проблемами параллелизма.
Как ни странно, синхронизированный блок не работает, если я вызываю ProgressMonitorDialog # run с параметром fork = true.
Может кто-нибудь объяснить мне, что здесь происходит?
Вывод:
start synchronization Thread[main,5,main]
start synchronization Thread[main,5,main]
finished synchronization Thread[main,5,main]
finished synchronization Thread[main,5,main]
Код:
private void test() {
Shell shell = new Shell();
SyncTest st = new SyncTest(shell);
shell.getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
st.doSmth();
}
});
shell.getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
st.doSmth();
}
});
}
private static class SyncTest {
private static final Object LOCK = new Object();
private Shell shell;
public SyncTest(Shell shell) {
this.shell = shell;
}
public void doSmth() {
synchronized (LOCK) {
System.out.println("start synchronization " + Thread.currentThread().toString());
try {
ProgressMonitorDialog pmd = new ProgressMonitorDialog(shell);
pmd.run(true, true, new IRunnableWithProgress() {
@Override
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
Thread.sleep(1000);
}
});
} catch (InvocationTargetException | InterruptedException e) {
e.printStackTrace();
}
System.out.println("finished synchronization " + Thread.currentThread().toString());
}
}
}