Bloco sincronizado dentro do método de execução

Se eu tenho algo como abaixo, então o que isso significa dentro synchronized block

synchronised (syncObject) {

Basicamente, isso significa que apenas um thread pode estar dentro do bloco acima e, assim que um thread terminar de ser executado, o segundo thread entrará no bloco sincronizado sincronizado (syncObject) . Certo? Alguém pode me explicar em uma linguagem LayMan para que eu possa ter uma melhor imagem?

private static final class Task implements Runnable {
{
  private static Object syncObject = new Object();

    public Task(Command command, BlockingQueue<Integer> pool1, BlockingQueue<Integer> pool2) {
    this.command = command;
    this.existPool = pool1;
    this.newPool = pool2;
}

  public void run()
  {
    synchronised (syncObject) {
      if() {
        existId = existPool.take();
        attributeMethod(existId);
        } else if() {
            newId = newPool.take();
            attributeMethod(newId);
        }
    }
  }
}

// So I need to make this method synchronized or not? Currently I have made this synchronized
private synchronized void attributeMethod(int range) {
    // And suppose If I am calling any other method here-

 sampleMethod();
}


// What about this method, I need to make this synchronized as well? or not?
private synchronized void sampleMethod() {


}
Resposta 1

Basicamente, isso significa que apenas um thread pode estar dentro do bloco acima e, assim que um thread terminar de ser executado, o segundo thread entrará no bloco sincronizado sincronizado (syncObject). Certo?

Certo!

Então, eu preciso fazer esse método sincronizado ou não?

Não, você não. Supondo que o método só será chamado de dentro do bloco sincronizado no run()método, esse bloco já impedirá que vários threads executem o método simultaneamente. Portanto, declarar que o método synchronizedé redundante.

No entanto, devo salientar algumas coisas:

  • Quando você declara um método de instância como synchronized, ele será sincronizado this; ou seja, no Taskobjeto. Mas seu synchronizedbloco está sincronizando em um objeto diferente ... o objeto em syncObject. Nesse caso, isso não importa. No entanto, se o synchronizedbloco no run()método não estivesse lá, você descobriria que os threads estavam tentando sincronizar em diferentes objetos ... e você NÃO obteria exclusão mútua.

  • Ao sincronizar no nível superior do run()método ... usando um único compartilhado syncObjectpara todos os threads que executam essa tarefa ... você está efetivamente executando as tarefas uma de cada vez. Isso anula completamente todos os benefícios do uso de threads.

  • É uma boa prática declarar a variável que contém um objeto de bloqueio privado (como syncObject) final. Isso evita a possibilidade de que algo possa sobrescrevê-lo ... resultando em uma falha de sincronização.

Resposta: 2

Como executo um aplicativo externo, transmito os argumentos e retorno o resultado do aplicativo externo usando java #ProcessBuilder e #RunTime? teste de classe pública {public static void main (...

Estou executando o seguinte código em Java: 1) Primeiro código: public class Basic {static int a = 10; estático {a = 20; } public static void main (String args []) {...

Eu tenho um grande número de arquivos (alguns milhares de arquivos XML) e preciso escrever uma GUI em java que classifique esses arquivos em uma estrutura de árvore com base nos elementos "Categoria" nos dados XML de cada ...

Como faço para o Spring carregar as propriedades do Hibernate no hibernate.cfg.xml? Estamos usando o Spring e o JPA (com o Hibernate como implementação). O applicationContext.xml da Spring especifica o dialeto JPA ...