SlideShare uma empresa Scribd logo
1 de 6
Baixar para ler offline
Java Memory Model – FAQ
Table of Contents
O que é ?...............................................................................................................................................1
Reordenação de Operações:..................................................................................................................2
Conceito de sincronização:...................................................................................................................3
Keyword 'Final':...................................................................................................................................4
Keyword 'Volatile':...............................................................................................................................5
O que é ?
Em primeiro lugar, para efeitos de contexto, estamos a falar de sistemas com vários
processadores integrados em si mesmo. Tipicamente, estes sistemas contém vários níveis de
cache de memória, algo que melhora significativamente a performance de acesso a dados. No
entanto, com adição destas caches, algumas questões têm de ser tratadas com cautela. Por
exemplo:
• O que acontece quando dois processadores apontam para a mesma localização de
memória, ao mesmo tempo;
• Em que condições serão, os dois, capazes de visualizar o mesmo conteudo nessa
mesma localização de memória;
Basicamente, se analisarmos ao pormenor diversos processadores, seriamos capazes de
perceber que, consoante o cpu/modelo em causa, estaríamos na presença de um modelo de
memória que poderia ser muito bom ou muito mau. No entanto, enquanto programadores
de linguagens de alto nível, a abstração é tão grande que nunca se deve relacionar conceitos de
tão baixo nível com essas mesmas abstrações. Desta forma, a linguagem Java detém um
modelo que descreve o comportamento adequado em situações de código multi-threading,
bem como as Threads devem agir perante determinadas operações em memória. Descreve as
relações existentes entre variáveis de um programa com os detalhes de baixo-nivel
relativos à memória e processador.
Para ajudar nesta descrição e estabelecimento de regras relativamente ao modelo imposta
pela linguagem Java, a mesma detém funcionalidades que procuram ajudar o programador a
construir código concorrente sem erros:
• Volatile e Final keywords;
• Blocos synchronized;
• etc..
Ao especificar este modelo de memoria, a linguagem Java assegura que todos os programas
multi-threading executam corretamente em todas as arquiteturas.
Reordenação de Operações:
Por vezes, na execução de um programa, pode parecer que uma ou mais instruções estão a ser
executadas numa ordem diferente daquela que está especificada pelo código fonte. Faz-se
notar que, o compilador tem a liberdade de ordenar a execução de instruções caso entenda
que as mesmas serão otimizadas se for feita uma reordenação. A reordenação pode ser feita
por outras entidades que não o compilador.
Por exemplo, quando é feita uma escrita para uma variável a e depois para uma variável b, e o
valor de 'b' não depende do valor de 'a', então o compilador pode reordenar estas instruções
como bem entender.
Reordenações podem ter efeitos nefastos num programa multi-threading, porque tipicamente
, neste tipo de programas Threads estão interessadas em saber o que outras Threads andam a
fazer. Neste caso, para garantir o correto funcionamento, mesmo sobre reordenações de
operações, é aplicado o conceito de sincronização.
Conceito de sincronização:
O conceito de sincronização enquadra-se em diversos aspetos, sendo o mais conhecido, a
exclusão-mútua.
De uma forma geral, sincronização garante que, dados escritos anteriormente à execução de
um bloco synchronized estarão visíveis para a Thread que detém esse “bloco” de uma forma
previsível. Após sairmos desse bloco, libertamos o monitor, o mesmo é dizer, tornamos todas
as mudanças feitas durante esse bloco em mudanças fixas e visíveis para as outras Threads.
Antes de entrarmos num bloco, temos de adquirir o monitor, o mesmo é dizer que
invalidamos o acesso a caches locais do cpu de forma a que as variáveis sejam obtidas através
de acesso a memória principal.
O modelo de memória introduz novos conceitos como read-field, write-field, lock,
unlock, e novas operações sobre Threads como join e start. Introduz ainda o conceito de
relação entre operações denominado por happens-before.
Quando duas operações estabelecem esta relação entre si, entenda-se 'a' happens-before 'b',
significa que a operação 'a' irá sempre, mesmo que reordenada, ser executada antes da
operação 'b', bem como os seus resultados estarão visíveis perante o inicio de 'b'.
Algo que é completamente errado fazer é o seguinte padrão de código:
• synchronized (new Object()) {….}
O compilador irá remover por completo esta forma de “sincronização”, uma vez que é
inteligente o suficiente para perceber que nunca outra Thread irá tentar adquirir um lock
relativo a um monitor que não é referenciado por nenhuma referência.
É importante ter consciência de que, duas Threads têm de sincronizar relativamente ao
mesmo monitor, por forma a estabelecer esta relação de happens-before.
Keyword 'Final':
Dentro do modelo de memória Java, a keyword final e o comportamtento adjacente a esta,
explica o facto de classes imutáveis serem sempre Thread-Safe.
Porquê ?
Vejamos então o que significa ser 'final'. Quando um campo é 'final', esse mesmo campo será
visível para todas as Threads, mesmo sem qualquer sincronização implementada, após um
construção de objecto bem realizada. Por bem construido, entende-se que todas as funções de
construção de um objecto são apenas e só realizadas dentro do construtor.
Veja-se o seguinte exemplo:
Qualquer Thread que invoque o método reader, conseguirá visualizar f.x como tendo o valor
de 3. O mesmo não se pode dizer sobre y.
Assim, conclui-se que, uma classe que tenha uma construção bem realizada, bem como todos
os seus campos serem 'final', é uma classe immutable e sempre Thread-Safe, pois os seus
campos apresentarão sempre os valores armazenados sempre que forem invocados por outras
Threads.
Faz-se notar que, mesmo uma classe ser completamente Thread-Safe não remove a
necessidade de sincronização por parte de Threads que queiram ter acesso a esta. Por
exemplo, não existe forma de garantir que a referência para o objecto imutável será
correctamente visualizado por uma segunda Thread.
class FinalFieldExample {
final int x;
int y;
static FinalFieldExample f;
public FinalFieldExample() {
x = 3;
y = 4;
}
static void writer() {
f = new FinalFieldExample();
}
static void reader() {
if (f != null) {
int i = f.x;
int j = f.y;
}
}
}
Keyword 'Volatile':
Um mecanismo que foi implementado para possibilitar a comunicação de estados entre
Threads.
Cada leitura de um campo volatile irá sempre obter o último valor escrito até à data por
qualquer Thread. Proíbe o compilador e o runtime de armazenarem estes valores em registos.
Em vez disso, são sempre escritos na memória principal.
Faz-se notar um grande e importante aspeto que nem sempre é evidenciado pela literatura
acerca de variáveis volatile. O modelo de memória aplica uma enorme restrição no que toca à
escrita e leitura de variáveis volatile.
Entenda-se que:
• Escrita sobre um volatile => release de um monitor;
• Leitura de um volatile => adquire de um monitor;
(=> - “equivale a”)
Isto acontece porque, tudo o que é visível para uma Thread no dado momento em que a
mesmo escrever sobre um volatile, também tem de ser visível para uma próxima
Thread que vá ler o volatile.
No seguinte exemplo, temos então a garantia de visualizar um campo que não é final apenas
porque estamos perante a escrita de um valor numa variável volatile.
É importante perceber que, ambas as Threads têm de aceder à mesma variável volatile de
forma a estabelecer a propriedade Happens-Before.
class VolatileExample {
int x = 0;
volatile boolean v = false;
public void writer() {
x = 42;
v = true;
}
public void reader() {
if (v == true) {
//uses x - guaranteed to see 42.
}
}
}
Por Pedro Almeida.
Baseado em: http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html

Mais conteúdo relacionado

Mais procurados

Mutexes, Monitores e Semáforos
Mutexes, Monitores e SemáforosMutexes, Monitores e Semáforos
Mutexes, Monitores e Semáforos
Thiago Poiani
 

Mais procurados (19)

Síncrono vs Assíncrono
Síncrono vs AssíncronoSíncrono vs Assíncrono
Síncrono vs Assíncrono
 
Net - Threads
Net - ThreadsNet - Threads
Net - Threads
 
Resumo OpenMP
Resumo OpenMPResumo OpenMP
Resumo OpenMP
 
Aula java[1]
Aula java[1]Aula java[1]
Aula java[1]
 
Mutexes, Monitores e Semáforos
Mutexes, Monitores e SemáforosMutexes, Monitores e Semáforos
Mutexes, Monitores e Semáforos
 
Programação Concorrente - Gerenciamento de Threads - Parte I
Programação Concorrente - Gerenciamento de Threads - Parte IProgramação Concorrente - Gerenciamento de Threads - Parte I
Programação Concorrente - Gerenciamento de Threads - Parte I
 
OpenMP Day1
OpenMP Day1OpenMP Day1
OpenMP Day1
 
OpenMP Day 3
OpenMP Day 3OpenMP Day 3
OpenMP Day 3
 
The Developer's Conference (TDC) 2013 - São Paulo: Programação assíncrona com...
The Developer's Conference (TDC) 2013 - São Paulo: Programação assíncrona com...The Developer's Conference (TDC) 2013 - São Paulo: Programação assíncrona com...
The Developer's Conference (TDC) 2013 - São Paulo: Programação assíncrona com...
 
Aula 1 - Java - Prof.ª Cristiane Fidelix
Aula 1 - Java - Prof.ª Cristiane FidelixAula 1 - Java - Prof.ª Cristiane Fidelix
Aula 1 - Java - Prof.ª Cristiane Fidelix
 
Computacao distribuida com rmi
Computacao distribuida com rmiComputacao distribuida com rmi
Computacao distribuida com rmi
 
12 threads
12 threads12 threads
12 threads
 
C# 6.0 - DotNetBaixada - Novembro/2015
C# 6.0 - DotNetBaixada - Novembro/2015C# 6.0 - DotNetBaixada - Novembro/2015
C# 6.0 - DotNetBaixada - Novembro/2015
 
Programação Concorrente - Introdução
Programação Concorrente - IntroduçãoProgramação Concorrente - Introdução
Programação Concorrente - Introdução
 
Estrutura de repetição
Estrutura de repetiçãoEstrutura de repetição
Estrutura de repetição
 
Shell script
Shell script Shell script
Shell script
 
Aula Persistência 01 (Java)
Aula Persistência 01 (Java)Aula Persistência 01 (Java)
Aula Persistência 01 (Java)
 
Regiões críticas dos Sistemas Operacionais
Regiões críticas dos Sistemas OperacionaisRegiões críticas dos Sistemas Operacionais
Regiões críticas dos Sistemas Operacionais
 
OpenMP
OpenMPOpenMP
OpenMP
 

Destaque (8)

Boletim 10 Projeto Geração Mulher
Boletim 10 Projeto Geração MulherBoletim 10 Projeto Geração Mulher
Boletim 10 Projeto Geração Mulher
 
Anexos Edital Memorias Brasileiras
Anexos Edital Memorias BrasileirasAnexos Edital Memorias Brasileiras
Anexos Edital Memorias Brasileiras
 
Tecnologia educativa
Tecnologia educativaTecnologia educativa
Tecnologia educativa
 
C:\Fakepath\TecnologíAs Para La InnovacióN Educativa
C:\Fakepath\TecnologíAs Para La InnovacióN EducativaC:\Fakepath\TecnologíAs Para La InnovacióN Educativa
C:\Fakepath\TecnologíAs Para La InnovacióN Educativa
 
Como tirar uma fonte de alimentaçao
Como tirar uma fonte de alimentaçaoComo tirar uma fonte de alimentaçao
Como tirar uma fonte de alimentaçao
 
Formato de gestión escolar momento 1
Formato de gestión escolar momento 1Formato de gestión escolar momento 1
Formato de gestión escolar momento 1
 
Noções de economia 2
Noções de economia 2Noções de economia 2
Noções de economia 2
 
Programa de governo pronto
Programa de governo prontoPrograma de governo pronto
Programa de governo pronto
 

Semelhante a Java memory model primary ref. - faq

Gabarito da P1 de PROG
Gabarito da P1 de PROGGabarito da P1 de PROG
Gabarito da P1 de PROG
Marcos de Vita
 
Programação Paralela - Threads
Programação Paralela - ThreadsProgramação Paralela - Threads
Programação Paralela - Threads
Glaucio Scheibel
 
Apostila De Visualg
Apostila De VisualgApostila De Visualg
Apostila De Visualg
ecompo
 
Apostila De Visualg
Apostila De VisualgApostila De Visualg
Apostila De Visualg
ecompo
 

Semelhante a Java memory model primary ref. - faq (20)

Spring & Struts
Spring & StrutsSpring & Struts
Spring & Struts
 
Javascript por debaixo dos panos
Javascript por debaixo dos panosJavascript por debaixo dos panos
Javascript por debaixo dos panos
 
Mvc model view controller - java para desenvolvimento web
Mvc   model view controller - java para desenvolvimento webMvc   model view controller - java para desenvolvimento web
Mvc model view controller - java para desenvolvimento web
 
THREADS EM JAVA: INTRODUÇÃO
THREADS EM JAVA: INTRODUÇÃOTHREADS EM JAVA: INTRODUÇÃO
THREADS EM JAVA: INTRODUÇÃO
 
Conhecendo o Spring
Conhecendo o SpringConhecendo o Spring
Conhecendo o Spring
 
UNIFAL - MySQL Transações - 5.0/5.6
UNIFAL - MySQL Transações - 5.0/5.6UNIFAL - MySQL Transações - 5.0/5.6
UNIFAL - MySQL Transações - 5.0/5.6
 
Sap – stablility and abstract principle
Sap – stablility and abstract principleSap – stablility and abstract principle
Sap – stablility and abstract principle
 
Gabarito da P1 de PROG
Gabarito da P1 de PROGGabarito da P1 de PROG
Gabarito da P1 de PROG
 
Banco de Dados 2: Controle de Concorrência
Banco de Dados 2: Controle de ConcorrênciaBanco de Dados 2: Controle de Concorrência
Banco de Dados 2: Controle de Concorrência
 
Workshop React Hooks
Workshop React HooksWorkshop React Hooks
Workshop React Hooks
 
Curso de ReactJS
Curso de ReactJSCurso de ReactJS
Curso de ReactJS
 
JPA - Mini-Livro - Iniciação e Conceitos
JPA - Mini-Livro - Iniciação e ConceitosJPA - Mini-Livro - Iniciação e Conceitos
JPA - Mini-Livro - Iniciação e Conceitos
 
Introdução ao Node.js
Introdução ao Node.jsIntrodução ao Node.js
Introdução ao Node.js
 
Compiladores
CompiladoresCompiladores
Compiladores
 
Programação Paralela - Threads
Programação Paralela - ThreadsProgramação Paralela - Threads
Programação Paralela - Threads
 
Apostila De Visualg
Apostila De VisualgApostila De Visualg
Apostila De Visualg
 
Apostila De Visualg
Apostila De VisualgApostila De Visualg
Apostila De Visualg
 
Apresentação Java, SOA, MICROSERVICE, HTTP, HTTPS, VERSIONAMENTO DE CONTRATO,
Apresentação Java, SOA, MICROSERVICE, HTTP, HTTPS, VERSIONAMENTO DE CONTRATO, Apresentação Java, SOA, MICROSERVICE, HTTP, HTTPS, VERSIONAMENTO DE CONTRATO,
Apresentação Java, SOA, MICROSERVICE, HTTP, HTTPS, VERSIONAMENTO DE CONTRATO,
 
Interface
InterfaceInterface
Interface
 
Threads 09: Paralelismo
Threads 09: ParalelismoThreads 09: Paralelismo
Threads 09: Paralelismo
 

Mais de Pedro De Almeida

Mais de Pedro De Almeida (20)

Sistemas Operativos - Processos e Threads
Sistemas Operativos - Processos e ThreadsSistemas Operativos - Processos e Threads
Sistemas Operativos - Processos e Threads
 
IP Multicast Routing
IP Multicast RoutingIP Multicast Routing
IP Multicast Routing
 
XSD Incomplete Overview Draft
XSD Incomplete Overview DraftXSD Incomplete Overview Draft
XSD Incomplete Overview Draft
 
O Projecto, Gestão de Projectos e o Gestor de Projectos - Parte 1
O Projecto, Gestão de Projectos e o Gestor de Projectos - Parte 1O Projecto, Gestão de Projectos e o Gestor de Projectos - Parte 1
O Projecto, Gestão de Projectos e o Gestor de Projectos - Parte 1
 
Validation of a credit card number
Validation of a credit card numberValidation of a credit card number
Validation of a credit card number
 
Classes e Objectos JAVA
Classes e Objectos JAVAClasses e Objectos JAVA
Classes e Objectos JAVA
 
Ficheiros em JAVA
Ficheiros em JAVAFicheiros em JAVA
Ficheiros em JAVA
 
Excepções JAVA
Excepções JAVAExcepções JAVA
Excepções JAVA
 
Sessão 10 Códigos Cíclicos
Sessão 10 Códigos CíclicosSessão 10 Códigos Cíclicos
Sessão 10 Códigos Cíclicos
 
Sessao 9 Capacidade de canal e Introdução a Codificação de canal
Sessao 9 Capacidade de canal e Introdução a Codificação de canalSessao 9 Capacidade de canal e Introdução a Codificação de canal
Sessao 9 Capacidade de canal e Introdução a Codificação de canal
 
Sessão 8 Codificação Lempel-Ziv
Sessão 8 Codificação Lempel-ZivSessão 8 Codificação Lempel-Ziv
Sessão 8 Codificação Lempel-Ziv
 
Sessao 7 Fontes com memória e codificação aritmética
Sessao 7 Fontes com memória e codificação aritméticaSessao 7 Fontes com memória e codificação aritmética
Sessao 7 Fontes com memória e codificação aritmética
 
Sessao 5 Redundância e introdução à codificação de fonte
Sessao 5 Redundância e introdução à codificação de fonteSessao 5 Redundância e introdução à codificação de fonte
Sessao 5 Redundância e introdução à codificação de fonte
 
Sessão 6 codificadores estatísticos
Sessão 6 codificadores estatísticosSessão 6 codificadores estatísticos
Sessão 6 codificadores estatísticos
 
Sessao 4 - Chaves espúrias e distância de unicidade
Sessao 4 - Chaves espúrias e distância de unicidadeSessao 4 - Chaves espúrias e distância de unicidade
Sessao 4 - Chaves espúrias e distância de unicidade
 
Sessao 3 Informação mútua e equívocos
Sessao 3 Informação mútua e equívocosSessao 3 Informação mútua e equívocos
Sessao 3 Informação mútua e equívocos
 
Sessao 2 Introdução à T.I e Entropias
Sessao 2 Introdução à T.I e EntropiasSessao 2 Introdução à T.I e Entropias
Sessao 2 Introdução à T.I e Entropias
 
Cripto - Introdução, probabilidades e Conceito de Segurança
Cripto - Introdução, probabilidades e Conceito de SegurançaCripto - Introdução, probabilidades e Conceito de Segurança
Cripto - Introdução, probabilidades e Conceito de Segurança
 
Basic java tutorial
Basic java tutorialBasic java tutorial
Basic java tutorial
 
Avaliação económica de projectos
Avaliação económica de projectosAvaliação económica de projectos
Avaliação económica de projectos
 

Último

Slide - SAEB. língua portuguesa e matemática
Slide - SAEB. língua portuguesa e matemáticaSlide - SAEB. língua portuguesa e matemática
Slide - SAEB. língua portuguesa e matemática
sh5kpmr7w7
 
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
azulassessoria9
 
A EDUCAÇÃO FÍSICA NO NOVO ENSINO MÉDIO: IMPLICAÇÕES E TENDÊNCIAS PROMOVIDAS P...
A EDUCAÇÃO FÍSICA NO NOVO ENSINO MÉDIO: IMPLICAÇÕES E TENDÊNCIAS PROMOVIDAS P...A EDUCAÇÃO FÍSICA NO NOVO ENSINO MÉDIO: IMPLICAÇÕES E TENDÊNCIAS PROMOVIDAS P...
A EDUCAÇÃO FÍSICA NO NOVO ENSINO MÉDIO: IMPLICAÇÕES E TENDÊNCIAS PROMOVIDAS P...
PatriciaCaetano18
 
atividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdf
atividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdfatividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdf
atividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdf
Autonoma
 
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
azulassessoria9
 
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...
azulassessoria9
 
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
azulassessoria9
 
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
azulassessoria9
 

Último (20)

Slide - SAEB. língua portuguesa e matemática
Slide - SAEB. língua portuguesa e matemáticaSlide - SAEB. língua portuguesa e matemática
Slide - SAEB. língua portuguesa e matemática
 
Falando de Física Quântica apresentação introd
Falando de Física Quântica apresentação introdFalando de Física Quântica apresentação introd
Falando de Física Quântica apresentação introd
 
Sistema de Bibliotecas UCS - Cantos do fim do século
Sistema de Bibliotecas UCS  - Cantos do fim do séculoSistema de Bibliotecas UCS  - Cantos do fim do século
Sistema de Bibliotecas UCS - Cantos do fim do século
 
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
 
Novena de Pentecostes com textos de São João Eudes
Novena de Pentecostes com textos de São João EudesNovena de Pentecostes com textos de São João Eudes
Novena de Pentecostes com textos de São João Eudes
 
Sopa de letras | Dia da Europa 2024 (nível 2)
Sopa de letras | Dia da Europa 2024 (nível 2)Sopa de letras | Dia da Europa 2024 (nível 2)
Sopa de letras | Dia da Europa 2024 (nível 2)
 
Apresentação | Símbolos e Valores da União Europeia
Apresentação | Símbolos e Valores da União EuropeiaApresentação | Símbolos e Valores da União Europeia
Apresentação | Símbolos e Valores da União Europeia
 
A EDUCAÇÃO FÍSICA NO NOVO ENSINO MÉDIO: IMPLICAÇÕES E TENDÊNCIAS PROMOVIDAS P...
A EDUCAÇÃO FÍSICA NO NOVO ENSINO MÉDIO: IMPLICAÇÕES E TENDÊNCIAS PROMOVIDAS P...A EDUCAÇÃO FÍSICA NO NOVO ENSINO MÉDIO: IMPLICAÇÕES E TENDÊNCIAS PROMOVIDAS P...
A EDUCAÇÃO FÍSICA NO NOVO ENSINO MÉDIO: IMPLICAÇÕES E TENDÊNCIAS PROMOVIDAS P...
 
AULÃO de Língua Portuguesa para o Saepe 2022
AULÃO de Língua Portuguesa para o Saepe 2022AULÃO de Língua Portuguesa para o Saepe 2022
AULÃO de Língua Portuguesa para o Saepe 2022
 
Modelos de Inteligencia Emocional segundo diversos autores
Modelos de Inteligencia Emocional segundo diversos autoresModelos de Inteligencia Emocional segundo diversos autores
Modelos de Inteligencia Emocional segundo diversos autores
 
Monoteísmo, Politeísmo, Panteísmo 7 ANO2.pptx
Monoteísmo, Politeísmo, Panteísmo 7 ANO2.pptxMonoteísmo, Politeísmo, Panteísmo 7 ANO2.pptx
Monoteísmo, Politeísmo, Panteísmo 7 ANO2.pptx
 
aprendizagem significatica, teórico David Ausubel
aprendizagem significatica, teórico David Ausubelaprendizagem significatica, teórico David Ausubel
aprendizagem significatica, teórico David Ausubel
 
GUIA DE APRENDIZAGEM 2024 9º A - História 1 BI.doc
GUIA DE APRENDIZAGEM 2024 9º A - História 1 BI.docGUIA DE APRENDIZAGEM 2024 9º A - História 1 BI.doc
GUIA DE APRENDIZAGEM 2024 9º A - História 1 BI.doc
 
O desenvolvimento é um conceito mais amplo, pode ter um contexto biológico ou...
O desenvolvimento é um conceito mais amplo, pode ter um contexto biológico ou...O desenvolvimento é um conceito mais amplo, pode ter um contexto biológico ou...
O desenvolvimento é um conceito mais amplo, pode ter um contexto biológico ou...
 
atividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdf
atividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdfatividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdf
atividade-de-portugues-paronimos-e-homonimos-4º-e-5º-ano-respostas.pdf
 
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
O estudo do controle motor nada mais é do que o estudo da natureza do movimen...
 
Sopa de letras | Dia da Europa 2024 (nível 1)
Sopa de letras | Dia da Europa 2024 (nível 1)Sopa de letras | Dia da Europa 2024 (nível 1)
Sopa de letras | Dia da Europa 2024 (nível 1)
 
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...
Considerando as pesquisas de Gallahue, Ozmun e Goodway (2013) os bebês até an...
 
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
 
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
ATIVIDADE 2 - DESENVOLVIMENTO E APRENDIZAGEM MOTORA - 52_2024
 

Java memory model primary ref. - faq

  • 1. Java Memory Model – FAQ Table of Contents O que é ?...............................................................................................................................................1 Reordenação de Operações:..................................................................................................................2 Conceito de sincronização:...................................................................................................................3 Keyword 'Final':...................................................................................................................................4 Keyword 'Volatile':...............................................................................................................................5 O que é ? Em primeiro lugar, para efeitos de contexto, estamos a falar de sistemas com vários processadores integrados em si mesmo. Tipicamente, estes sistemas contém vários níveis de cache de memória, algo que melhora significativamente a performance de acesso a dados. No entanto, com adição destas caches, algumas questões têm de ser tratadas com cautela. Por exemplo: • O que acontece quando dois processadores apontam para a mesma localização de memória, ao mesmo tempo; • Em que condições serão, os dois, capazes de visualizar o mesmo conteudo nessa mesma localização de memória; Basicamente, se analisarmos ao pormenor diversos processadores, seriamos capazes de perceber que, consoante o cpu/modelo em causa, estaríamos na presença de um modelo de memória que poderia ser muito bom ou muito mau. No entanto, enquanto programadores de linguagens de alto nível, a abstração é tão grande que nunca se deve relacionar conceitos de tão baixo nível com essas mesmas abstrações. Desta forma, a linguagem Java detém um modelo que descreve o comportamento adequado em situações de código multi-threading, bem como as Threads devem agir perante determinadas operações em memória. Descreve as relações existentes entre variáveis de um programa com os detalhes de baixo-nivel relativos à memória e processador.
  • 2. Para ajudar nesta descrição e estabelecimento de regras relativamente ao modelo imposta pela linguagem Java, a mesma detém funcionalidades que procuram ajudar o programador a construir código concorrente sem erros: • Volatile e Final keywords; • Blocos synchronized; • etc.. Ao especificar este modelo de memoria, a linguagem Java assegura que todos os programas multi-threading executam corretamente em todas as arquiteturas. Reordenação de Operações: Por vezes, na execução de um programa, pode parecer que uma ou mais instruções estão a ser executadas numa ordem diferente daquela que está especificada pelo código fonte. Faz-se notar que, o compilador tem a liberdade de ordenar a execução de instruções caso entenda que as mesmas serão otimizadas se for feita uma reordenação. A reordenação pode ser feita por outras entidades que não o compilador. Por exemplo, quando é feita uma escrita para uma variável a e depois para uma variável b, e o valor de 'b' não depende do valor de 'a', então o compilador pode reordenar estas instruções como bem entender. Reordenações podem ter efeitos nefastos num programa multi-threading, porque tipicamente , neste tipo de programas Threads estão interessadas em saber o que outras Threads andam a fazer. Neste caso, para garantir o correto funcionamento, mesmo sobre reordenações de operações, é aplicado o conceito de sincronização.
  • 3. Conceito de sincronização: O conceito de sincronização enquadra-se em diversos aspetos, sendo o mais conhecido, a exclusão-mútua. De uma forma geral, sincronização garante que, dados escritos anteriormente à execução de um bloco synchronized estarão visíveis para a Thread que detém esse “bloco” de uma forma previsível. Após sairmos desse bloco, libertamos o monitor, o mesmo é dizer, tornamos todas as mudanças feitas durante esse bloco em mudanças fixas e visíveis para as outras Threads. Antes de entrarmos num bloco, temos de adquirir o monitor, o mesmo é dizer que invalidamos o acesso a caches locais do cpu de forma a que as variáveis sejam obtidas através de acesso a memória principal. O modelo de memória introduz novos conceitos como read-field, write-field, lock, unlock, e novas operações sobre Threads como join e start. Introduz ainda o conceito de relação entre operações denominado por happens-before. Quando duas operações estabelecem esta relação entre si, entenda-se 'a' happens-before 'b', significa que a operação 'a' irá sempre, mesmo que reordenada, ser executada antes da operação 'b', bem como os seus resultados estarão visíveis perante o inicio de 'b'. Algo que é completamente errado fazer é o seguinte padrão de código: • synchronized (new Object()) {….} O compilador irá remover por completo esta forma de “sincronização”, uma vez que é inteligente o suficiente para perceber que nunca outra Thread irá tentar adquirir um lock relativo a um monitor que não é referenciado por nenhuma referência. É importante ter consciência de que, duas Threads têm de sincronizar relativamente ao mesmo monitor, por forma a estabelecer esta relação de happens-before.
  • 4. Keyword 'Final': Dentro do modelo de memória Java, a keyword final e o comportamtento adjacente a esta, explica o facto de classes imutáveis serem sempre Thread-Safe. Porquê ? Vejamos então o que significa ser 'final'. Quando um campo é 'final', esse mesmo campo será visível para todas as Threads, mesmo sem qualquer sincronização implementada, após um construção de objecto bem realizada. Por bem construido, entende-se que todas as funções de construção de um objecto são apenas e só realizadas dentro do construtor. Veja-se o seguinte exemplo: Qualquer Thread que invoque o método reader, conseguirá visualizar f.x como tendo o valor de 3. O mesmo não se pode dizer sobre y. Assim, conclui-se que, uma classe que tenha uma construção bem realizada, bem como todos os seus campos serem 'final', é uma classe immutable e sempre Thread-Safe, pois os seus campos apresentarão sempre os valores armazenados sempre que forem invocados por outras Threads. Faz-se notar que, mesmo uma classe ser completamente Thread-Safe não remove a necessidade de sincronização por parte de Threads que queiram ter acesso a esta. Por exemplo, não existe forma de garantir que a referência para o objecto imutável será correctamente visualizado por uma segunda Thread. class FinalFieldExample { final int x; int y; static FinalFieldExample f; public FinalFieldExample() { x = 3; y = 4; } static void writer() { f = new FinalFieldExample(); } static void reader() { if (f != null) { int i = f.x; int j = f.y; } } }
  • 5. Keyword 'Volatile': Um mecanismo que foi implementado para possibilitar a comunicação de estados entre Threads. Cada leitura de um campo volatile irá sempre obter o último valor escrito até à data por qualquer Thread. Proíbe o compilador e o runtime de armazenarem estes valores em registos. Em vez disso, são sempre escritos na memória principal. Faz-se notar um grande e importante aspeto que nem sempre é evidenciado pela literatura acerca de variáveis volatile. O modelo de memória aplica uma enorme restrição no que toca à escrita e leitura de variáveis volatile. Entenda-se que: • Escrita sobre um volatile => release de um monitor; • Leitura de um volatile => adquire de um monitor; (=> - “equivale a”) Isto acontece porque, tudo o que é visível para uma Thread no dado momento em que a mesmo escrever sobre um volatile, também tem de ser visível para uma próxima Thread que vá ler o volatile. No seguinte exemplo, temos então a garantia de visualizar um campo que não é final apenas porque estamos perante a escrita de um valor numa variável volatile. É importante perceber que, ambas as Threads têm de aceder à mesma variável volatile de forma a estabelecer a propriedade Happens-Before. class VolatileExample { int x = 0; volatile boolean v = false; public void writer() { x = 42; v = true; } public void reader() { if (v == true) { //uses x - guaranteed to see 42. } } }
  • 6. Por Pedro Almeida. Baseado em: http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html