Я намеревался написать общий буфер между потоком-производителем и потоком-потребителем. Вот мои коды:
class PQueue
{
Token token;
boolean flag = false; // false: add, true: poll
PQueue()
{
token = null;
}
synchronized void add(Token token)
{
if(flag == true)
{
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
flag = true;
notify();
this.token = token;
}
synchronized Token poll()
{
if(flag == false)
{
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
flag = false;
notify();
return this.token;
}
}
Я новичок в многопоточности. Есть ли потенциальные ошибки параллелизма? Является ли это «стандартным/общим» способом достижения этой цели? Или есть более простой и эффективный способ?
notify()
внутри синхронизированного блока выглядит подозрительно для меня (но не могу сказать, работает ли это или приводит к взаимоблокировкам) - person Andreas Dolk   schedule 14.08.2012notify()
по-другому, что ты имеешь в виду под подозрением? (Его код подозрительный по другим причинам, но не по этой.) - person vanza   schedule 14.08.2012