После прочтения статей Simmering Unicode, доведите DPL до кипения и " Simmering Unicode, доведите DPL до кипения (часть 2) " от Oracle в Delphi (Аллен Бауэр), Oracle - это все, что я понимаю:)
В статье упоминается параллельная библиотека Delphi (DPL), блокированные структуры данных, блокировки взаимного исключения и переменные условия (эта статья в Википедии переходила к Monitor (synchronization) ', а затем вводит новый тип записи TMonitor для синхронизации потоков и описывает некоторые из его методов.
Существуют ли в них статьи с примерами, которые показывают, когда и как этот тип записи Delphi можно использовать? Существует некоторая документация в Интернете.
-  В чем основное отличие между TCriticalSection и TMonitor? 
-  Что мне делать с методами PulseиPulseAll?
-  Есть ли у него аналог, например, на С# или на языке Java? 
-  Есть ли какой-либо код в RTL или VCL, который использует этот тип (чтобы он мог служить примером)? 
Обновление: статья Почему размер объекта TObject удваивается в Delphi 2009? объясняет, что каждый объект в Delphi теперь можно заблокировать с помощью TMonitor запись по цене четырех дополнительных байтов на экземпляр.
Похоже, что TMonitor реализована аналогично Внутренние блокировки на языке Java:
Каждый объект имеет встроенный замок связанные с ним. По соглашению, поток, который требует эксклюзивных и последовательный доступ к объекту поля должны приобретать объект внутренняя блокировка перед доступом к ним, и затем отпустите встроенный замок когда это делается с ними.
Wait, Pulse и PulseAll в Delphi, похоже, являются копиями wait(), notify() и notifyAll() в Java-программировании язык. Исправьте меня, если я ошибаюсь:)
Обновление 2:  Пример кода для приложения-производителя/потребителя с использованием TMonitor.Wait и TMonitor.PulseAll на основе статьи об охраняемых методах в  учебники по Java (tm) (комментарии приветствуются):
Этот вид приложений разделяет данные между двумя потоками: производитель, который создает данные, и потребитель, который что-то с этим делает. Два потока обмениваются данными, используя общий объект. Координация важно: потребительский поток должен не пытаться извлечь данные до того, как поток производителя доставил его, а продюсерскую нить не должны пытаться доставлять новые данные если потребитель не получил старые данные.
В этом примере данные представляют собой серию текстовых сообщений, которые совместно используются объектом типа Drop:
program TMonitorTest;
// based on example code at http://download.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html
{$APPTYPE CONSOLE}
uses
  SysUtils, Classes;
type
  Drop = class(TObject)
  private
    // Message sent from producer to consumer.
    Msg: string;
    // True if consumer should wait for producer to send message, false
    // if producer should wait for consumer to retrieve message.
    Empty: Boolean;
  public
    constructor Create;
    function Take: string;
    procedure Put(AMessage: string);
  end;
  Producer = class(TThread)
  private
    FDrop: Drop;
  public
    constructor Create(ADrop: Drop);
    procedure Execute; override;
  end;
  Consumer = class(TThread)
  private
    FDrop: Drop;
  public
    constructor Create(ADrop: Drop);
    procedure Execute; override;
  end;
{ Drop }
constructor Drop.Create;
begin
  Empty := True;
end;
function Drop.Take: string;
begin
  TMonitor.Enter(Self);
  try
    // Wait until message is available.
    while Empty do
    begin
      TMonitor.Wait(Self, INFINITE);
    end;
    // Toggle status.
    Empty := True;
    // Notify producer that status has changed.
    TMonitor.PulseAll(Self);
    Result := Msg;
  finally
    TMonitor.Exit(Self);
  end;
end;
procedure Drop.Put(AMessage: string);
begin
  TMonitor.Enter(Self);
  try
    // Wait until message has been retrieved.
    while not Empty do
    begin
      TMonitor.Wait(Self, INFINITE);
    end;
    // Toggle status.
    Empty := False;
    // Store message.
    Msg := AMessage;
    // Notify consumer that status has changed.
    TMonitor.PulseAll(Self);
  finally
    TMonitor.Exit(Self);
  end;
end;
{ Producer }
constructor Producer.Create(ADrop: Drop);
begin
  FDrop := ADrop;
  inherited Create(False);
end;
procedure Producer.Execute;
var
  Msgs: array of string;
  I: Integer;
begin
  SetLength(Msgs, 4);
  Msgs[0] := 'Mares eat oats';
  Msgs[1] := 'Does eat oats';
  Msgs[2] := 'Little lambs eat ivy';
  Msgs[3] := 'A kid will eat ivy too';
  for I := 0 to Length(Msgs) - 1 do
  begin
    FDrop.Put(Msgs[I]);
    Sleep(Random(5000));
  end;
  FDrop.Put('DONE');
end;
{ Consumer }
constructor Consumer.Create(ADrop: Drop);
begin
  FDrop := ADrop;
  inherited Create(False);
end;
procedure Consumer.Execute;
var
  Msg: string;
begin
  repeat
    Msg := FDrop.Take;
    WriteLn('Received: ' + Msg);
    Sleep(Random(5000));
  until Msg = 'DONE';
end;
var
  ADrop: Drop;
begin
  Randomize;
  ADrop := Drop.Create;
  Producer.Create(ADrop);
  Consumer.Create(ADrop);
  ReadLn;
end.
Теперь это работает так, как ожидалось, однако есть детали, которые я мог бы улучшить: вместо блокирования всего экземпляра Drop с помощью TMonitor.Enter(Self); я мог бы выбрать мелкозернистый подход к блокировке с (частным) полем "FLock", используя его только в методах Put и Take на TMonitor.Enter(FLock);.
Если я сравниваю код с версией Java, я также замечаю, что в Delphi нет InterruptedException, который можно использовать для отмены вызова Sleep.
Обновление 3: в мае 2011 года запись в блоге о OmniThreadLibrary показала возможную ошибку в реализации TMonitor, Это похоже на запись в Quality Central. В комментариях упоминается, что патч был предоставлен пользователем Delphi, но он не отображается.
Обновление 4: A сообщение в блоге в 2013 году показало, что пока TMonitor является "честным", его производительность хуже чем в критической секции.
