Você está na página 1de 31

Programação

Concorrente e Distribuída

Coordenação de Threads
Sincronização

Sumário
• O que é a coordenação de threads.
FILME
• Quais os mecanismos de coordenação:
– wait
– notify/notifyAll

• Qual a implementação genérica de uma variável


condicional.
• Perceber como o java implementa a sincronização e a
coordenação.
Sincronização

Sincronização
• Permite evitar a interferência entre threads no
acesso a recursos partilhados
• No entanto as ações de duas ou mais threads
pode exigir mais do que a simples sincronização:
– ordem pela qual as threads acedem aos recursos
partilhados
Sincronização

Coordenação
• Procurar uma palavra num conjunto de documentos
Procuram Recurso partilhado Analisa
resultados

4
2

3
Icon made by Freepik from www.flaticon.com
Sincronização

Coordenação
• Procurar uma palavra num conjunto de documentos

2 4

Icon made by Freepik from www.flaticon.com


Sincronização

Coordenação
• Existem 2 problemas

1º colocar 2º retirar
1

2 4

3
Sincronização

Coordenação
• 1º problema: colocação do ficheiro
colocar:
-coloca ficheiro na mesa
1
Problemas:
- perdemos o resultado do
agente 1
2

Icon made by Freepik from www.flaticon.com


Sincronização

Coordenação
• 1º problema: colocação do ficheiro
colocar:
-espera pela mesa livre
1 (repete: verifica mesa livre)

- coloca ficheiro na mesa

Problemas:
2 - thread sempre a verificar
- CPU a 100%
- consumo de energia
- etc...
3

Icon made by Freepik from www.flaticon.com


Sincronização

Coordenação
• 2º problema: retirar resultados da mesa
retirar:
- repete: verifica que a
mesa tem um resultado

X Existe resultado?
]
-retira resultado

4 Problemas:
- thread sempre a verificar
- CPU a 100%
- consumo de energia
- etc...
Sincronização

Produtor - Consumidor
• Produtores: um conjunto de threads que
produzem informação.
• Consumidores: um conjunto de threads que usam
a informação.
• Recurso Partilhado: recurso que permite a troca
de informação entre um produtor e um
consumidor
Sincronização

Produtor
• Usa método do recurso partilhado para colocar
• método colocar que deve ter as seguintes
propriedades:
– Permitir acessos em exclusão mutua (acesso sincronizado);
– Caso o recurso partilhado não tenha capacidade para
guardar a informação deve colocar o produtor em espera até
que o seu estado seja alterado (que seja retirada
informação)
Sincronização

Consumidor
• Usa um método do recurso partilhado para retirar,
este método que deve ter as seguintes propriedades:
– Permitir acessos em exclusão mutua (acesso sincronizado);
– Caso o recurso partilhado não tenha nenhuma informação
guardada deve colocar o consumidor em espera até que o
seu estado seja alterado ( que seja colocada nova
informação)
Recurso Partilhado
public class Table{
private SearchResult result;

public synchronized int put(SearchResult newResult) {



}

public synchronized SearchResult get() {



}
} Métodos que vão alterar o
estado da mesa de uma
forma concorrente
put
public class Table{
private SearchResult result;

public synchronized int put(SearchResult newResult) {

result = newResult;
}
}
put
public class Table{
private SearchResult result;

public synchronized int put(SearchResult newResult) {


while(result != null){
try{
wait();
} catch (InterruptedException e) { ... }
}
result = newResult;
}
}
get
public class Table{
private SearchResult result;
public synchronized SearchResult get() {
while(result == null){
try{
wait();
} catch (InterruptedException e) { ... }
}
SearchResult resultToReturn = result;
result = null;
return resultToReturn;
}
get
public class Table{
private SearchResult result;
public synchronized SearchResult get() {
while(result == null){
try{
wait();
} catch (InterruptedException e) { ... }
}
SearchResult resultToReturn = result;
result = null;
return resultToReturn;
}
Sincronização

wait e notify
wait

1
notify

2 4

3
Sincronização

wait e notify

1 wait
notify

2 4

3
public class Table{
get
private SearchResult result;
public synchronized SearchResult get() {
while(result == null){
try{
wait();
} catch (InterruptedException e) { ... }
}
SearchResult resultToReturn = result;
result = null;
notifyAll(); //tem como objetivo notificar os produtores
return resultToReturn;
}
put
public class Table{
private SearchResult result;

public synchronized int put(SearchResult newResult) {


while(result != null){
try{
wait();
} catch (InterruptedException e) { ... }
}
result = newResult;
notifyAll(); //tem como objetivo notificar os consumidores
}
wait
• Põe a thread em espera até que uma outra invoque o
método notify() ou notifyAll() do mesmo objecto.
• Para invocar o wait, a thread tem de ter o cadeado
intrínseco do objecto bloqueado.
– Quando a thread muda para o estado NOT_RUNNABLE
liberta o cadeado.
– Antes de voltar ao estado RUNNABLE a thread tem de voltar
a conseguir bloquear o cadeado.
notify e notifyAll
• notify – notifica uma thread aleatória de entre as
threads em espera no objecto.
• notifyAll – notifica todas as threads em espera no
objecto.
• Para invocar o notify ou o notifyAll, a thread tem de
ter o cadeado intrínseco do objecto bloqueado.
THREADS

Ciclo de vida das Threads


CPU Running

o.wait ()
start()
New Thread Runnable Not-Runnable

o.notify()

Dead
Sincronização

Coordenação no objecto
Sincronização

Coordenação no objecto
1 wait

notify
2
A
A
A 5

3 wait

4
BB
Sincronização

Coordenação no objecto
1 wait

2
A
B
5

B 3 wait notifyAll

4
BB
Mesa para vários resultados
public class Table{
private LinkedList<SearchResult> results =
new LinkedList<SearchResult>();

public synchronized int put(SearchResult newResult) {



}

public synchronized SearchResult get() {



}
}
put
public class Table{
private LinkedList<SearchResult> results =
new LinkedList<SearchResult>();

public synchronized int put(SearchResult newResult) {


results.add(newResult);
notify(); //tem como objetivo notificar um dos consumidores
}
}
get
public class Table{
private LinkedList<SearchResult> results =
new LinkedList<SearchResult>();

public synchronized SearchResult get() {


while(results.isEmpty()){
try{
wait();
} catch (InterruptedException e) { … }
}
return results.removeFirst();
}
Sumário
• Coordenação de threads.
• wait
• notify/notifyAll
• Perceber como o java
implementa a sincronização e a
coordenação.

Você também pode gostar