Problema no acesso de servidor Bluetooth

Pessoal, estou desenvolvendo um programa com base no BlueChat(programa de conversa que usa BlueTooth) . O meu problema é que tem um momento que os celulares clientes enviam mensagens ao mesmo tempo, ou seja, acessam o servidor ao mesmo tempo.

Eu tentei usar synchronized, mas só piorou a situação, quando tiro o synchronized, this.wait(), etc , funciona menos pior , somente no final que dá problema.

O pedaço do código segue abaixo : (Esse código faz parte do servidor,é ele que faz a função de leitura do que os clientes escrevem)


         synchronized(this)
          { 
           if( cont == 0 || nomeGarçom.equals(endpt.remoteName) )
           {  
            arrayStringPedido[cont] = datain.readUTF();
            nomeGarçom=endpt.remoteName; 
            log("read in SIGNAL_SEND_PEDIDO name "+arrayStringPedido[cont]+" from "+endpt.remoteName);
            cont++;
           }
           else
           {
            try
            { 
              log(endpt.remoteName+" (NA ESPERA -- NA ESPERA -- NA ESPERA -- NA ESPERA -- NA ESPERA -- NA ESPERA) PARA ENVIO DE MEU PEDIDO");
              this.wait();
            }
            catch(InterruptedException e)
            {} 
           } 
          }
        }else if ( signal == NetLayer.SIGNAL_TERMINATE_SEND_PEDIDO ) 
        {
          datain.readUTF();


          PedidoRecordStore objPedidoRecordStore = new PedidoRecordStore ();
          // update the message screen to reflect the entered message.
          // create a dummy packet object to hold the entered message.
          ChatPacket packet = new ChatPacket( NetLayer.SIGNAL_TERMINATE_SEND_PEDIDO, endpt.remoteName,  "Pedido: "+(objPedidoRecordStore.buscaNumRecords()+1)+" acaba de chegar" );
          messageui.msgs.addElement( packet );
          messageui.repaint(); 
            

          log(" NetLayer.SIGNAL_TERMINATE_SEND_PEDIDO  --  NetLayer.SIGNAL_TERMINATE_SEND_PEDIDO (CONT VALUE:) "+cont);
          cont=0;
          objPedidoRecordStore.salvaPedido( arrayStringPedido );
      

          synchronized(this)
          { 
           this.notifyAll();
          }

        }

Pessoal, vou detalhar mais:

Eu quero fazer que o servidor seje bloqueado quando um cliente estiver usando ele. Eu tentei , mas acho que está acontecendo o seguinte: Quando o primeiro cliente manda mensagens ,e outro cliente manda logo depois (enquanto o primeiro ainda está mandando)o servidor é bloqueado ( this.wait() ) e aí dá problema pros dois clientes … Acaba que dá maior bagunça e eu não consigo o sucesso …

Quando eu tiro o synchronized, this.wait(), notifyAll() funciona bem (acho que porque cada cliente cria uma instância própria do servidor pra ele, então funciona bem). Mas, no final, quando checo no servidor, vejo que perdeu o sincronismo e afeta no funcionamento do uso de uns RecordStores que eu tenho …

Pessoal, preciso muito da ajuda de alguém … Se quiserem (acho que vai ser melhor) posso mandar o projeto pra vcs entenderem melhor o que estou dizendo. Mas, se alguém já teve a mesma experiência e conseguiu a solução , por favor , me ajude , tb.

Obrigado,

Raphael.

Pensando melhor :Já coloquei o projeto em Anexo. (é um projeto J2ME que usa BlueTooth, o BlueWaiter é o cliente e o BlueKitchen é o servidor. Pra fazer o teste e entender o q eu falei é só abrir 3 instâncias clientes, cadastrar algum pedido e enviar , tentar enviar com quase nenhum intervalo entre os envios de cada instância.Tentar enviar os pedidos dos clientes quase ao msm tempo , deu pra entender?)Lembrando que os clientes e servidor tem que ser do msm tipo (na tela de entrada vcs vão ver o q é o tipo q eu falo); os celulares clientes têm que ser de nomes diferentes(tb, tela da entrada). Depois do envio dos pedidos é só checar no servidor , opção de comunicação e vcs vão ver o problema q eu tenho)

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHHHHHHHHHHHHHHHHHHHH!!!

Por favor, me ajudem.

EDIT - Por favor, quando postar código, use a tag [ code ] (use o botãozinho na página) porque o código é reformatado e a compreensão torna-se difícil, se você não usar a tag [ code ].