0% acharam este documento útil (0 voto)
53 visualizações14 páginas

Java e Questões

Este código define uma classe Counter que mantém um contador privado. A classe contém métodos para incrementar, decrementar e obter o valor atual do contador. Se usada por vários threads simultaneamente, pode levar a condições de corrida devido à falta de sincronização. A palavra-chave synchronized pode ser usada para tornar os métodos thread-safe.

Enviado por

leonardoalves
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PPTX, PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
53 visualizações14 páginas

Java e Questões

Este código define uma classe Counter que mantém um contador privado. A classe contém métodos para incrementar, decrementar e obter o valor atual do contador. Se usada por vários threads simultaneamente, pode levar a condições de corrida devido à falta de sincronização. A palavra-chave synchronized pode ser usada para tornar os métodos thread-safe.

Enviado por

leonardoalves
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PPTX, PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 14

JAVA

● 1. Palavras-chave: Essas palavras mágicas definem as ações e estruturas do seu


programa. São como os verbos e substantivos da linguagem Java, como class,
public, static, void, main, if, else, for, while, entre outras.

● 2. Identificadores: São os nomes que você dá às variáveis, classes, métodos e


outros elementos do seu programa. Pense neles como apelidos que facilitam a
leitura e organização do código

● 3. Literais: Representam valores fixos, como números (10, 3.14), strings ("Olá,
Mundo!"), caracteres ('a', 'B') e valores booleanos (true, false).

● 4. Operadores: São os símbolos que realizam operações matemáticas (+, -, *, /),


lógicas (&&, ||, !) e de comparação (==, !=, <, >, <=, >=).
Continuando
1. Declaração de Classe:

public class NomeDaClasse {


// Corpo da classe
}

● public: Define a acessibilidade da classe.


● class: Indica o início da declaração da classe.
● NomeDaClasse: Substitua por um nome significativo para sua classe.
● // Corpo da classe: É onde você coloca os métodos e variáveis da sua
classe.
2. Método main:

public static void main(String[] args) {


// Código a ser executado
}

● public: Define a acessibilidade do método.


● static: Indica que o método pertence à classe e não a um objeto específico.
● void: Significa que o método não retorna nenhum valor.
● main: É o ponto de entrada do programa, onde a execução começa.
● String[] args: Representam os argumentos passados para o programa na linha de
comando.
● // Código a ser executado: É onde você escreve as instruções que seu programa deve
realizar.
3. Variáveis:

tipo nomeVariavel = valorInicial ;

● tipo: Define o tipo de dado que a variável armazenará (ex: int,


double, String, boolean).
● nomeVariavel: Escolha um nome significativo para sua
variável.
● valorInicial: Opcionalmente, você pode inicializar a variável
com um valor.
JSON (JavaScript Object Notation)

● Fácil de ler e escrever para humanos


● Pode ser usado em várias linguagens de programação sem modificação.
● Os dados são estruturados como uma coleção não ordenada de pares chave-valor, semelhantes a objetos
JavaScript. Os valores podem ser strings, números, valores booleanos, arrays ou objetos aninhados.

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;

public void increment() {


c++;
}

public void decrement() {


c--;
}

public int value() {


return c;
}
}

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:

1. increment(): Este método incrementa o valor de c em 1. Se c for 0, depois de chamar


este método, c será 1.
2. decrement(): Este método decrementa o valor de c em 1. Se c for 1, depois de chamar
este método, c será 0.
3. value(): Este método retorna o valor atual de c.

Em resumo, esta classe é um contador simples que pode ser incrementado e


decrementado. No entanto, como mencionado anteriormente, se usado em um ambiente
multithread, pode levar a condições de corrida devido à falta de sincronização entre os
threads. Espero que isso ajude! Se você tiver mais perguntas, fique à vontade para
perguntar.
Item A) Que problemas podem ocorrer se vários threads invocarem os métodos pertencentes à
classe simultaneamente?

Explicação:

Se vários threads invocarem os métodos increment() e decrement()


simultaneamente, pode ocorrer uma condição de corrida. Isso significa que o
resultado final do contador pode ser imprevisível e incorreto, pois as operações de
incremento e decremento não são atômicas (não são executadas como uma única
operação indivisível).
Item B) Qual é o efeito da palavra-chave volátil usada nesta classe e como ela afetaria
vários threads que invocam os métodos pertencentes à classe simultaneamente?

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;

public synchronized void increment() {


c++;
}

public synchronized void decrement() {


c--;
}

public synchronized int value() {


return c;
}
}

removi a palavra-chave volatile de c, pois synchronized já garante a visibilidade das alterações


entre os threads.
QUESTÃO 2)
A função fib calcula o enésimo número de Fibonacci onde n é especificado pelo parâmetro de índice. O
resultado é retornado em um objeto Java BigInteger que pode representar números arbitrariamente grandes.

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.

Você também pode gostar