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 类
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 域中
* 将对象的引用保存到由锁保护的域中