Você deve fazer este EP em Java, usando threads Java e os recursos para sincronização entre threads oferecidos pela linguagem (métodos/blocos synchronized, operações wait(), notify() e notifyAll()). Se possível evite o uso de notifyAll(), que facilita os algoritmos mas tende a penalizar o desempenho.
Note que a solução vista em classe para o caso de um barbeiro só (seção
5.2.5 do livro do Andrews) usou um monitor com três variáveis de
condição. No caso mais geral de barbeiros você certamente vai
precisar de mais de uma variável de condição. O desafio aqui é implementar
em Java algo equivalente a um monitor com múltiplas variáveis de
condição. Ler a seção 3.7 (e especificamente o ítem 3.7.3) do livro do
Doug Lea deve ajudar você nessa tarefa.