Я пытаюсь синхронизировать 3 потока. Каждый из них обрабатывает гусеницу, которая движется по ее собственному пути. км. К сожалению, их дорожки пересечены следующим образом: Темы - Разблокировка блокировки с использованием флагов и попытка/наконец
Для этой цели я пользуюсь замками. Есть два раздела, где разделены блоки: горизонтальные и вертикальные (я назвал его выше и ниже). Проблема в том, что поток в одной точке хочет быть в двух разделяемых разделах одновременно.
Мой вопрос:
Могу ли я разблокировать замок внутри TRY/наконец, п, используя флаг?
Я имею в виду, что когда нить разблокирует блокировку внутри предложения try/finally, устанавливается флаг, и в предложении finally он проверяет, установлен ли флаг, а затем не разблокируется второй раз. Я думаю, что это безопасное решение, но, возможно, я ошибаюсь.
Есть ли другой способ синхронизации потоков?
Это мой код: (Это почти работает)
public void moveForward() throws InterruptedException {
redIsUpofAbove();
int choose= 0;
if (Route.critcalSectionAbove.contains(head))
choose= 1;
if (Route.critcalSectionBelow.contains(head))
choose= 2;
switch (choose) {
case 1: {
boolean flag = true;
System.err.println(name + " Lock above");
synchronization.aboveLock.lock();
try {
takeNextGrid();
Thread.sleep(sleepValue);
while (isInAboveCriticalSection()) {
takeNextGrid();
Thread.sleep(sleepValue);
if (isInBelowCriticalSection()) {// Caterpillar is on two
// shared sections
System.out.println(name + " Lock below");
if (!synchronization.belowLock.tryLock()) {
synchronization.aboveLock.unlock();
System.out.println(name + " Unlock above");
synchronization.belowLock.lock();
flag = false;
}
try {
while (isInBelowCriticalSection()) {
takeNextGrid();
if (!isInAboveCriticalSection() && flag) {
synchronization.aboveLock.unlock();
flag = false;
System.out.println(name + " Unlock above");
}
Thread.sleep(sleepValue);
}
} catch (Exception e) {
} finally {
synchronization.belowLock.unlock();
System.err.println(name + "Unlock belovelock");
}
}
}
} catch (Exception e) {
} finally {
if (flag) {
synchronization.aboveLock.unlock();
System.out.println(name + " unlock above");
}
}
break;
}
case 2: {
boolean flag = true;
System.err.println(name + " Lock below");
synchronization.belowLock.lock();
try {
takeNextGrid();
Thread.sleep(sleepValue);
while (isInBelowCriticalSection()) {
takeNextGrid();
Thread.sleep(sleepValue);
if (isInAboveCriticalSection()) {
if (!synchronization.aboveLock.tryLock() && flag) {
synchronization.belowLock.unlock();
System.out.println(name + " Unlock below");
synchronization.aboveLock.lock();
flag = false;
}
try {
System.out.println(name + " Lock above");
while (isInAboveCriticalSection()) {
takeNextGrid();
if (!isInBelowCriticalSection() && flag == true) {
synchronization.belowLock.unlock();
flag = false;
System.out.println(name + " Lock below");
}
Thread.sleep(sleepValue);
}
} catch (Exception e) {
} finally {
synchronization.aboveLock.unlock();
System.err.println(name + "Lock abovelock");
}
}
}
} catch (Exception e) {
} finally {
if (flag) {
synchronization.belowLock.unlock();
System.out.println("Opuszczam belowLock");
}
}
break;
}
default: {
takeNextGrid();
break;
}
}
}
И последний вопрос:
Есть ли способ, чтобы установить приоритет, чтобы проснуться, на нитях, которые ждут на заблокированный замок?
Спасибо за ваш ответ, это было очень полезно и полезно. Я думал о ваших советах, и я пришел к выводу, что это правильный алгоритм. Я реализовал его и ... его работу! Концепция этого упражнения состояла в том, чтобы использовать отдельные потоки и синхронизировать их. Я был очень близко, но семафоры на замках оказались чем-то необходимым. Еще раз спасибо. – TomaszGrzybowski