The document discusses two solutions to classic concurrency problems:
1) An unbounded buffer problem is solved using locks and conditions variables to control access to a shared buffer by producer and consumer threads.
2) The dining philosophers problem is solved by having philosophers randomly wait after acquiring one fork in order to avoid deadlock when acquiring the second fork. Locks are used to limit philosophers trying to acquire forks simultaneously.