Остановите синхронизацию повторного въезда только для указанной функции (или кода) во время ожидания, но разрешайте синхJAVA

Программисты JAVA общаются здесь
Anonymous
Остановите синхронизацию повторного въезда только для указанной функции (или кода) во время ожидания, но разрешайте синх

Сообщение Anonymous »

Как лучше всего достичь следующих целей?
, скажем, даны две синхронизированные функции Func1 и func2 < /p>
public class xyz {
private Object x1 = new Object();
private boolean isWaiting = false;

public void func1() {
synchronized(this.x) {
if(/*condition1 == expectedvalue*/1 == 1) {
this.isWaiting = true;
this.x1.wait();
}
}
}

public void func2() {
synchronized(this.x1) {
if(this.isWaiting) {
this.x1.notifyAll();
this.isWaiting = false;
}
}
}
}
< /code>
Теперь моя цель состоит в том, чтобы, когда func1 a wait (), он остается невозвратным для других потоков, которые хотят ввести его, но в то же время потоки, которые хотят выполнить Func2, разрешены Чтобы ввести его синхронизированный в объект x1 и функцию ожидания уведомления () func1, чтобы продолжить выполнение. < /p>
Моя идея также заключалась Итак, < /p>
public class xyz {
private Object x1 = new Object();
private Object x2 = new Object();
private boolean isWaiting = false;

public void func1() {
synchronized(this.x2) {
synchronized(this.x1) {
do_here_something_synchronized();
if(/*condition1 == expectedvalue*/1 == 1) {
this.isWaiting = true;
this.x1.wait();
}
}
}
}

public void func2() {
synchronized(this.x1) {
do_here_something_more_synchronized();
if(this.isWaiting) {
this.x1.notifyAll();
this.isWaiting = false;
}
}
}
}
< /code>
, что в теории означало бы, что Func1 перестанет быть повторным для других потоков при достижении объекта x2, но в то же время Func2 сможет выполнять работу синхронизации.
Вложенные синхронизированные блоки Плохая практика до сих пор, но есть ли лучший подход для достижения целей? java.util.concurrent.locks.* и т. д. без гнездования его внутри нескольких синхронизированных блоков?>

Подробнее здесь: https://stackoverflow.com/questions/794 ... hile-waiti

Вернуться в «JAVA»