Pergunta

Os tutoriais Java dizer: "não é possível por duas invocações de métodos sincronizados no mesmo objeto para intercalam."

O que isso significa para um método estático? Desde um método estático não tem objeto associado, será o bloqueio de palavras-chave sincronizado na classe, em vez do objeto?

Foi útil?

Solução

Uma vez que um método estático não tem objeto associado, será o bloqueio de palavra-chave sincronizado na classe, em vez do objeto?

Sim. :)

Outras dicas

Apenas para adicionar um pequeno detalhe para a resposta de Oscar (agradavelmente sucinta!), A seção relevante na especificação da linguagem Java é 8.4.3.6, 'sincronizado Métodos' :

Um método sincronizado adquire um monitor (§17.1) antes de executar. Para um método de classe (estático), o monitor associada com o objecto de classe para classe do método é usado. Para um método de exemplo, o monitor associado com este (o objecto para o qual o método foi invocada) é usado.

Um ponto que você tem que ter cuidado com (vários programadores geralmente caem nessa armadilha) é que não há nenhuma ligação entre métodos estáticos sincronizados e métodos não estáticos Sync'ed, ou seja:

class A {
    static synchronized f() {...}
    synchronized g() {...}
}

principal:

A a = new A();

Thread 1:

A.f();

Thread 2:

a.g();

f () e G () não são sincronizados uns com os outros e, assim, pode executar totalmente concorrentemente.

A menos que você implementar g () da seguinte forma:

g() {
    synchronized(getClass()) {
        ...
    }
}

I encontrar este padrão útil também quando eu quero implementar exclusão mútua entre as diferentes instâncias do objeto (o que é necessário quando accesing um recurso externo, por exemplo).

Tenha uma olhada na página de documentação do Oracle em Intrínseca Locks e sincronização

Você pode se perguntar o que acontece quando um método sincronizado estático é chamado, uma vez que um método estático está associado a uma classe, não um objeto. Neste caso, o fio adquire o bloqueio intrínseco para o objeto classe associado com a classe . Assim, o acesso a campos estáticos da classe é controlado por uma fechadura que é distinto do bloqueio para qualquer instância da classe .

Um método estático também tem um objeto associado. Ele pertence ao arquivo Class.class no JDK toolkit. Quando a carga arquivo .class para o carneiro, o Class.class cria uma instância do que chamou de objeto de modelo.

Por exemplo: - quando você tenta criar o objeto da classe de clientes existente como

Customer c = new Customer();

A carga Customer.class na RAM. Naquele momento Class.class no JDK kit de ferramentas cria um objeto chamado objeto do modelo e carga que Customer.class para esse modelo membros object.Static de que Customer.class tornar atributos e métodos em que objeto de modelo.

Assim, um método estático ou atributo também tem um objeto

A seguir exemplos dá mais clareza entre classe e bloqueio objeto, esperança abaixo exemplo ajudará os outros também:)

Por exemplo, temos abaixo métodos de uma classe adquirir e outra trava adquirida objeto:

public class MultiThread {

    public static synchronized void staticLock() throws InterruptedException {
        for (int i = 0; i < 10; i++) {
            Thread.sleep(100);
            System.out.println(Thread.currentThread().getName() + " " + i);
        }
    }

    public synchronized void objLock() throws InterruptedException {
        for (int i = 0; i < 10; i++) {
            Thread.sleep(100);
            System.out.println(Thread.currentThread().getName() + " " + i);
        }
    }
}

Assim, agora podemos ter seguinte cenários:

  1. Quando tópicos usando mesmo objeto tenta acessar objLock método staticLock mesmo tempo OR (isto é, ambos os segmentos estão tentando acessar mesmo método)

    Thread-0 0
    Thread-0 1
    Thread-0 2
    Thread-0 3
    Thread-0 4
    Thread-1 0
    Thread-1 1
    Thread-1 2
    Thread-1 3
    Thread-1 4
    
  2. Quando tópicos usando mesmo objeto tenta staticLock e objLock métodos de acesso simultâneo (tentativas acessando métodos diferentes)

    Thread-0 0
    Thread-1 0
    Thread-0 1
    Thread-1 1
    Thread-0 2
    Thread-1 2
    Thread-1 3
    Thread-0 3
    Thread-0 4
    Thread-1 4
    
  3. Quando tópicos usando diferente objeto tenta método de acesso staticLock

    Thread-0 0
    Thread-0 1
    Thread-0 2
    Thread-0 3
    Thread-0 4
    Thread-1 0
    Thread-1 1
    Thread-1 2
    Thread-1 3
    Thread-1 4
    
  4. Quando tópicos usando diferente objeto tenta método de acesso objLock

    Thread-0 0
    Thread-1 0
    Thread-0 1
    Thread-1 1
    Thread-0 2
    Thread-1 2
    Thread-1 3
    Thread-0 3
    Thread-0 4
    Thread-1 4
    

Para aqueles que não estão familiarizados método sincronizado estático bloqueado no objeto de classe, por exemplo, para classe string sua String.class enquanto instância sincronizado fechaduras método na instância atual do objeto denotado por “esta” palavra-chave em Java. Desde ambos objeto são diferentes eles têm bloqueio diferente por isso, enquanto um segmento está executando método estático sincronizada, outro thread em Java não precisa esperar por esse segmento para retornar em vez disso, irá adquirir bloqueio separado denotada byte .class literal e entrar em método sincronizado estático.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top