A primeira parte do JAVA multithreading (a) base de segurança de rosca

Concurrent Notes Portal:
1.0 Concurrent Programming-Mind Map
2.0 Concurrent Programming-Thread Safety Fundamentals
3.0 Concurrent Programming-Basic Building Module
4.0 Concurrent Programming-Task Execution-Future
5.0 Concurrent Programming- Multi-threaded Performance and Scalability
6.0 Concurrent Programming- Bloqueio explícito e
programação simultânea sincronizada 7.0 - AbstractQueuedSynchronizer
8.0 - programação simultânea - variáveis ​​atômicas e mecanismo de sincronização sem bloqueio

Segurança mínima

Quando uma thread lê uma variável sem sincronização, pode obter um valor inválido, mas pelo menos esse valor é um valor definido por uma thread anterior, não um valor aleatório. Este tipo de garantia de segurança é denominado segurança mínima.

A segurança mínima se aplica à maioria das variáveis, mas há uma exceção, variáveis ​​numéricas não voláteis de 64 bits (double e lang). O modelo de memória Java requer que as operações de leitura e gravação de variáveis ​​sejam operações atômicas, mas para variáveis ​​longas e duplas não voláteis, a JVM permite que operações de leitura ou gravação de 64 bits sejam decompostas em duas operações de 32 bits.

Variáveis ​​voláteis

Um mecanismo de sincronização mais fraco para garantir que outros threads sejam notificados sobre operações de atualização de variáveis. Quando declarado como um tipo volátil, tanto o compilador quanto o tempo de execução perceberão que essa variável é compartilhada, portanto, as operações nesta variável não serão reordenadas com outras operações de memória. Variáveis ​​voláteis não serão armazenadas em cache em registradores ou outros lugares que não são visíveis para o processador, então ao ler uma variável volátil, o último valor escrito sempre será retornado.

O mecanismo de travamento pode garantir visibilidade e atomicidade, enquanto variáveis ​​voláteis podem apenas garantir visibilidade.

  • condições de uso voláteis (se e somente se)
    • A operação de gravação na variável não depende do valor atual da variável ou para garantir que apenas um único thread atualize o valor da variável.
    • Esta variável não será incluída na condição de invariância junto com outras variáveis ​​de estado.
    • Nenhum bloqueio é necessário ao acessar variáveis.

Encerramento de fio

Evite usar sincronização e acessar dados em um único thread. A tecnologia confiável de fechamento de rosca inclui 栈封闭eThreadLocal

Encerramento de rosca ad-hoc

维护线程封闭性的职责完全由程序实现来承担。该方式是非常脆弱的。
可以通过在 volatile 变量上实现一种特殊的线程封闭。
确保只有单个线程对共享的 volatile 变量执行写入操作,
那么就可以安全的就可以安全的在这些共享的 volatile 变量上执行·读取·-·修改·-·写入·的操作。
在这种情况下,相当于将修改操作封闭在单个线程中以防止发生竟态条件,并且 volatile 变量还确保了其可见性。

Pilha fechada

线程封闭的一种特例,栈封闭中,只能通过局部变量才能访问对象。
局部变量的固有属性之一就是封闭在执行线程中。
它们位于执行线程的栈中,其他线程无法访问这个栈。

ThreadLocal 类

Clique aqui para obter o código-fonte detalhado

ThreadLocal 提供了 get 和 set 等访问接口和方法。
这些方法为每个使用该变量的线程都存有一份独立的副本,
因此 get 总是返回由当前执行线程在调用 set 时设置的最新值。

Imutabilidade

Objeto imutável

Depois que um objeto é criado, seu estado não pode ser modificado; esse objeto é chamado de objeto imutável.

不可变对象很简单,它们只有一种状态,并且该状态由构造函数控制。

Domínio final

final é usado para construir objetos imutáveis. O campo final não é modificável (mas se o objeto referenciado pelo campo final for mutável, então esses objetos referenciados podem ser modificados)
Conhecimento profundo da palavra-chave final

final 域能确保初始化过程的安全性,从而可以不受限制的访问不可变对象,并在共享这些对象时无需同步。

Objeto de liberação de segurança

要安全发布一个对象,对象的引用和状态必须同时对其他线程可见。
一个正确构造的对象可以通过以下方式来安全发布。
    * 在静态初始化函数中初始化一个对象引用
    * 将对象的引用保存到 volatile 类型的域或AtomicReferance中
    * 将对象的引用保存到某个正确构造对象的 final 域中
    * 将对象的引用保存到由锁保护的域中

Acho que você gosta

Origin blog.csdn.net/lijie2664989/article/details/103234782
Recomendado
Clasificación