Java e Questões
Java e Questões
● 3. Literais: Representam valores fixos, como números (10, 3.14), strings ("Olá,
Mundo!"), caracteres ('a', 'B') e valores booleanos (true, false).
Exemplo
{
"nome": "João Silva",
"idade": 30,
"hobbies": ["leitura", "programação", "caminhadas"],
"endereço": {
"rua": "Rua Principal 123",
"cidade": "Cidade Qualquer",
"estado": "SP"
}
}
QUESTÃO 1
vamos analisar o código:
class Counter {
private volatile int c = 0;
Este código define uma classe chamada Counter que tem um campo privado c, inicializado como 0. A palavra-chave volatile é usada
para indicar que c pode ser acessado por vários threads.
A classe Counter tem três métodos:
Explicação:
A palavra-chave volatile em Java garante que todas as leituras de uma variável são lidas
diretamente da memória principal e todas as gravações são gravadas diretamente na memória
principal. No entanto, volatile não garante atomicidade. Portanto, embora volatile garanta que
cada thread veja o valor mais recente de c, não impede condições de corrida quando as
operações increment() e decrement() são chamadas por vários threads simultaneamente.
Item C) Com base em suas respostas às partes (a) e (b), descreva recursos de vários
threads que poderiam invocar esse código simultaneamente com segurança e, por outro lado,
recursos de vários threads onde invocar o código simultaneamente seria inseguro. (7 marcas)
Se vários threads estiverem apenas lendo o valor de c usando o método value(), isso seria
seguro, pois a leitura de uma variável volatile é uma operação atômica. No entanto, se
vários threads estiverem invocando increment() e decrement() simultaneamente, isso seria
inseguro devido à possibilidade de condições de corrida, como mencionado na resposta
(a).
D) Para tornar a classe segura para uso simultâneo, você pode usar a palavra-chave
synchronized para os métodos increment() e decrement(). Isso garantirá que apenas um thread
possa acessar esses métodos de cada vez. Aqui está como você pode modificar o código:
class Counter {
private int c = 0;
A função que doCalculateFibs utiliza é uma entrada de array que contém valores de índice para calcular os
números de Fibonacci e uma saída de array do mesmo tamanho, para receber os números de Fibonacci. Ela
itera entre essas matrizes usando o método fib para calcular os números de Fibonacci.
A) a) Análise este código e identifique quais partes são ou não adequadas para paralelização,
explicando o porquê em cada caso.
R: A função fib(int index) não é adequada para paralelização porque o cálculo de um número
de Fibonacci depende dos dois números anteriores. Portanto, não podemos dividir esse
trabalho entre vários threads de maneira eficiente. No entanto, a função doCalculateFibs(int[]
input, BigInteger[] output) é adequada para paralelização porque o cálculo de cada número de
Fibonacci no array de entrada é independente dos outros.