Как лучше всего достичь следующих целей?
, скажем, даны две синхронизированные функции 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