Resposta genérica
O semáforo é uma técnica de alocação de recursos para gerenciar deadlocks e condições de corrida por meio de filas prioritárias. Colocando metaforicamente, você tem 3 bicicletas para alugar. Suponha que você o contrate por ordem de chegada. Portanto, se você contratou todas as suas 3 bicicletas e uma quarta pessoa solicita, ele deve esperar até que uma delas devolva a bicicleta. Há chances de você reservar a bicicleta para alguém, alguém pode cancelar uma bicicleta já reservada e assim por diante. Semelhante no caso de processos que desejam adquirir alguns recursos, semáforos são usados.
No caso de um semáforo distribuído, pode haver vários recursos que podem ser acessados por vários processos. Suponha que um servidor hospede um aplicativo e possa hospedar várias instâncias dele e o usuário possa usá-lo se for gratuito. Seja o servidor S1, S2, .. Sn enquanto o aplicativo é A1, A2, ... An e os usuários sejam U1, U2, ... Un. Portanto, se o primeiro servidor pudesse hospedar três instâncias do aplicativo, seria indicado como S1A1, S1A2, S1A3. Também assuma as instâncias do aplicativo como slots ou caixas para facilitar o entendimento. Um slot é considerado vazio quando está livre e cheio quando está ocupado. Portanto, neste caso, o seguinte método é sugerido
- Usuário solicita o aplicativo
- A solicitação é passada para uma fila de prioridade.
- A fila executa um processo contínuo em segundo plano para procurar slots livres e, quando um slot livre é encontrado, passa a solicitação ao aplicativo para iniciar o processamento
- Quando um slot recebe a solicitação, eles se marcam como ocupados, iniciam o processamento e se libertam quando terminam o processamento.
- Os slots periodicamente transmitem seu status para a fila para que a fila possa encaminhar as solicitações assim que um slot ficar livre
Recursos recomendados
- Este modelo é baseado no intermediário de mensagens. A fila que processa a solicitação deve estar sempre disponível. Também pode haver um modelo sem corretor que pode ser implementado de uma maneira diferente
- Programação de semáforo na Wikipedia
- O Little Book on Semaphores é um excelente recurso disponível gratuitamente
- O semáforo é baseado no modelo de memória compartilhada. O modelo do ator daria uma nova visão para resolver esse problema de uma maneira diferente
Resposta específica à pergunta no contexto
Observando o código, prefiro a versão clássica de um semáforo. O Java possui um pacote de semáforo incorporado para fazer isso e você pode facilmente construir nele.
Especificamente, eu gostaria de saber o que é um bom objetivo de primeira etapa ou um subsistema simples que eu possa implementar.
Supondo que apenas uma instância do aplicativo deva ser executada na LAN
- Use o pacote sugerido acima
- Crie o semáforo com um mecanismo de fila interno (semelhante a uma pilha) e implemente-o como um servidor
- Quando um usuário inicia o aplicativo, ele procura o semáforo, diminui a contagem (nesse caso, apenas 0, pois apenas uma única instância deve ser permitida) e concede ao usuário o acesso ao aplicativo.
- Quando um outro usuário inicia o aplicativo, ele procura o semáforo, já que é 0, coloca o usuário na fila e envia uma mensagem ao usuário de que o aplicativo está ocupado
- Quando o primeiro usuário sai do aplicativo, o semáforo é incrementado, o recurso fica disponível, o usuário fica íntimo e agora pode iniciar o aplicativo.
- O semáforo pode ser implementado como um servidor independente (possivelmente com uma interface da web simples) que pode ser acoplada ao aplicativo.
Vale a pena pensar nas seguintes advertências
- As filas podem ser totalmente liberadas ou a prioridade pode ser alterada
- O acoplamento ao aplicativo como servidor exige que exista apenas uma versão do servidor na LAN
- Prepare-se para falhas ou filas de mensagens autônomas (acesso de solicitação do usuário, mas não disponível quando o aplicativo é gratuito)
Eu provavelmente sugeriria o seguinte para uma melhor compreensão
- Siga este link para entender melhor
- Tente SCALA . Você pode usar todas as suas bibliotecas JAVA existentes e obter uma boa simultaneidade
- Dê uma olhada no ZMQ . Essa pode ser a opção se você abstrair todo o processo em um aplicativo de mensagens separado que interaja com os recursos
- Leia sobre o sistema de licenciamento do AutoCAD (eles implementam um modelo de licenciamento que corresponde a alguns de seus requisitos)
EDITAR
Resposta completamente editada, pois a resposta original é baseada em uma perspectiva muito mais ampla