Produtor Consumidor

Quem tem o livro de tanenbaum de SO, na pag 82 tem uma TAD do algoritmo do produtor consumidor usando semaforo. Minha dúvida é o seguinte. Como posso implementar os down e up do algoritmo??? tava pensando em usar uma classe Semaforo com os metodos synchronized(down e up) para cada variavel(mutex, empty e full). O problema e:

qnd o producer dê um:

down(&empty)
down(&mutex)
insert_item(item)

e logo depois tempo o consumer fizer:

down(&full)
down(&mutex)
item = remove_item()

qnd o producer fizer
up(&mutex)

o thread vai liberar(notify), o down full ou o down mutex, sendo isso executado pela primeira vez. e fazendo cada down e up um metodo sincronizado da classe semaforo