Arquivo da tag: operadores java

Java Livros ebooks pdf

Java Livros ebooks pdf. Linguagem Java. HUMILDADE ACIMA DE TUDO, ninguem é bom o bastante!!!Por isso ajude

Prazer meu nome é Igor, ja estudei nos centros de treinamentos oficiais da Sun microsystem alem de Impacta e outras escolas.

Sun microsystem é a Empresa detentora dos direitos autorais de todo a Plataforma java…Entrarei em mais detalhes sobre oque é a Plataforma e oque é a linguagem em proximas postagens.

Meus livros de Referência são:

Head First da Kathy Sierra, para quem não sabe ela trabalhou anos na Sun, E quem fez os livros dos cursos da propria Sun foi ela, Então acredite em mim OS LIVROS QUE A SUN DA TREINAMENTO e o Head First são incrivelmente parecidos.

Java Threads de Scott Oaks & Henry Wong, é realmente o melhor livro de Threads que eu ja li.

Sun, a Propria sun disponibiliza um tutorial ótimo, que eu sempre leio
http://java.sun.com/docs/books/tutorial/index.html

Jvm, http://java.sun.com/docs/books/jvms/second_edition/html/VMSpecTOC.doc.html – Para muitos que acham que a linguagem em si é importante, Lembre-se que java é um Ecossistema…Existem muitas coisas sobre a JVM que quase nenhum programador sabe.

Forum:
http://www.coderanch.com/forums/search/filters/-1
http://www.javaworld.com
http://forums.sun.com/sunsearch.jspa(Nada como estar em casa)

OPCODE
http://www.brics.dk/~mis/dOvs/jvmspec/ref-Java.html

JEDI (Java Education and Development Initiative), iniciativa para desenvolvimento e educação JAVA a distância), existe video Aulas, material didático e tudo de graça. E é uma iniciativa da própria SUN.
http://www.dfjug.org/DFJUG/jedi/index.jsp
Para video aulas:
http://jedi.wv.com.br/

Tiobe -> Ranking das linguagens de programação
*Indica a popularidade das linguagens de programação
http://www.tiobe.com/

Ted -> Novidades sobre o mundo da programação
www.ted.com

Dicas:

1 – Mais importante que ler livro é: – Aprenda a Desenhar – O proprio Head First diz sobre metacognição, seu cerebro trabalho muito melhor com imagens…E vai por mim, Tentar aprender java fica MUITO MAIS FACIL DESENHANDO!!!

2 – Não tenha Pressa…Sinta prazer pelo oque esta fazendo!

3 – Beba muita agua, quase 75% do corpo humano é agua, assim como qualquer atividade Fisica estudar gasta energia…Hidrate seu corpo, antes de cuidar de qualquer Sistema, cuide de você!

4 – Reflita sobre oque esta lendo

5 – Discuta com as pessoas sobre oque aprendeu

6 – Saiba a hora de parar, muita calma!

Tem mais dicas no Head First para quem gostou.

Como ultimas de apresentação gostaria de dizer algo que eu aprendi uma vez em uma palestra sobre java:

– Existe um ciclo, como ele não citou nome eu o chamei de “ciclo do conhecimento”
É o seguinte, você sabe uma coisa…Essa coisa você compartilha com 10 pessoas…10 pessoas compartilham com mais 10 pessoas cada uma…dessas pessoas algumas pegaram aquilo que você sabia e começaram a refletir….daquilo achou – se “n” coisas erradas na coisa que você compartilhou, Logo aquilo volta para você_ Agora voce tem a coisa que sabia em Versão totalmente melhorada e sabemos que o principio é: EVOLUIR SEMPRE!….Muito ate parecido com o JCP do java(JCP(http://jcp.org/en/home/index) É um grupo de pessoas e empresas que discutem soluções e melhorias para a Plataforma java)

Bom muito prazer!!! E por favor se forem compiar, pelo menos referencie meu blog, A maioria das postagens nesse blog são resumos ou conclusões da integração de muitos livros, e quando eu sei a FONTE eu sempre as coloco.
CYA DUDES!

Teoria Geral dos Sistemas Paradigmas conceituados Estrutural x Orientação a objetos

Teoria Geral dos Sistemas Paradigmas conceituados Estrutural x Orientação a objetos. Linguagem Java. Conceito Chave sobre a linguagem de programação java:
Advertência: É necessária a leitura do(s) Post(s): Princípios Básicos: Voce Tem que saber!

*Orientada a Objetos:
A linguagem programação java é Orientada a Objetos(Paradigma Orientado a objetos) o principal objetivo da linguagem é a criação de objetos,Pequenos pedaços de código que juntos formam a solução de um problema. Poucos sabem porem O Padradigma Orientado a objetos começou com a linguagem SIMULA-67(Sabe porque se chamala SIMULA? Pois com O.O ela fazia a Simulação da vida REAL), Porem a primeira que realmente entrou no Paradigma foi Smalltalk.

A partir de hoje, você aprenderá não só java, mais a desenhar. Quando dizemos que java é uma linguagem do paradigma Orientado a objetos, estamos dizendo que um CONJUNTO DE OBJETOS FORMAM um programa(Veja isso como um quebra cabeça, onde você pega peça por peça). ISSO é um objeto:

Exemplos Java,Linguagem Java, Programação, Java
Clique na imagem se quiser ampliar

E isso é um Programa feito no Paradigma Orientado a Objetos:

Exemplos Java,Linguagem Java, Programação, Java

Clique na imagem se quiser ampliar

Curiosidade:
Orientação a Objetos deriva da BIOLOGIA, de uma forma abstrata tudo é formado por moléculas sistematicamente falando no paradigma Orientação a Objetos tudo é um objeto(componente) o qual a idéia é muito parecida com a de molécula.

– Uma molécula interage com outras através de mensagems
– Quando uma molécula quer afetar outra, dispara um sinal químico que obtem a resposta desejada
– A membrana da cécula receptora filtra as mensagens, atende as que realmente fazem sentido fazendo funções internas.(Isso evita que uma célula precise conhecer oque a outra faz)

Então um conjunto de células forma um corpo físico, um conjunto de Objetos formam um programa.(Da biologia vem conceitos como Herança,Polimorfismo veremos mais sobre isso nas próximas seções.).

Teoria Geral dos Sistemas:
Daqui que surge a idéia de Orientação a Objetos

A Teoria Geral dos Sistemas foi elaborada, em 1937, por Ludwig Von Bertalanffy, para preencher uma lacuna na pesquisa e na teoria da Biologia. Os seus primeiros enunciados são de 1925 e ela é amplamente reconhecida na administração da década de 60.
Da definição de Bertalanffy , segundo a qual o sistema é um conjunto de unidades reciprocamente relacionadas , decorrem dois conceitos : o de propósito ( ou objeto ) e o de globalismo ( ou totalidade ) . Esses dois conceitos retratam duas características básicas em um sistema .

*** O conceito de elementos(Componentes) é o mesmo de OBJETOS EM JAVA

Um sistema é :

– Um conjunto de elementos
– Dinamicamente relacionados
– Formando uma atividade
– Para atingir um objetivo
– Operando sobre dados / energia / matéria
– Para fornecer informação / energia / matéria

O nivel de Abstração de um Sistema é importante:
As moléculas existem dentro das células , as células dentro dos tecidos , os tecidos dentro dos órgãos , os órgãos dentro dos organismos , os organismos dentro de colônias , as colônias dentro de culturas nutrientes , as culturas nutrientes dentro de conjuntos maiores de culturas , e assim por diante .

– Um Sistema pode ser Formado de moléculas(Olhando por um nivel mais baixo de abstração)
– Um Sistema pode ser Formado por células(Subindo um pouco mais o nivel de abstração)
– Um Sistema pode ser Formado por tecidos(Subindo ainda mais um pouco o nivel de abstração)

BIBLIOGRAFIA

Além das já citadas no trabalho: www.sbdg.org.br
Grupo de Formação 90 – SBDG

BERTALANFFY, L.v. – Teoria Geral dos Sistemas, Vozes, Petropólis , 1972
BERTALANFFY, L.v. – Teoria Geral dos Sistemas, Vozes, Petropólis , 1972

Qual a diferença entre Paradigma Orientado a Objetos(java) e o Paradigma estrutural?

A Orientação a Objetos e Estruturada, são paradigmas totalmente diferentes.

1 – Estrutural trata um programa como um Conjunto de instruções, Orientação a Objetos trata um programa como um Conjuntos de Objetos que interagem entre si(Assim como a derivação da Teoria Geral dos Sistemas):

Exemplos Java,Linguagem Java, Programação, Java

Clique na imagem se quiser ampliar

Orientação a Objetos:

Exemplos Java,Linguagem Java, Programação, Java
Clique na imagem se quiser ampliar

2 – I/O no dispositivo(Estrutural) X CRUD(Orientação a Objetos):

Conceitos Iniciais: O tempo de resposta do acesso a HD normalmente é de 10 elevado a -3(10 ^ -3), o tempo de resposta do acesso a RAM é de 10 elevado a -9(10 ^ -9).(Ou seja o acesso em Ram é muito mais rápido)

-> Linguagens com paradigma Estrutural trabalham com o conceito de I/O(Input/Output) no dispositivo.

Exemplos Java,Linguagem Java, Programação, Java
Clique na imagem se quiser ampliar

*A conexão entre dispositivos é feito e permancida, ou seja conecta-se um dispositivo no outro e fica conectado direto.(A leitura dos dados fica conforme a necessida porem a conexão é mantida),(Programa em RAM e dados em disco), fica nesse trabalho de acessar um ao outro.

-> Linguagens com paradigma Orientado a Objetos entra com o conceito de CRUD(Create, Retrieve, Update e Delete)

Exemplos Java,Linguagem Java, Programação, Java
Clique na imagem se quiser ampliar


* A conexão entre dispositivos só é feita na leitura de dados da HD, o programa todo(Programa e dados) trabalha em memória RAM, onde o tempo de resposta é bem menor.

3 – Decomposição da Visão dos Paradigmas:

Estrutural -> Começa em um nivel de Abstração de MACRO -> MICRO
Essencial -> Começa em um nivel de Abstração Intermediário.
Macro Intermediário -> Micro
Orientação a Objetos -> Começa em um nivel de Abstração MICRO, e o Conjunto de MICROS, formam um MACRO

Nasce o Conceito de Decomposição de Sistemas

4 – Geração:

Estrutural -> São linguagens de Terceira Geração
Orientação a Objetos -> São linguagens de Quarta Geração

5 – Conforme a distribuição do seu programa:

(Em estrutural temos o conceito de que um programa é dividido em duas partes: Dados e funções).

Conforme Observado no item 2, em linguagens estruturadas os dados estão em HD e as funções em RAM portanto:

Exemplos Java,Linguagem Java, Programação, Java
Clique na imagem se quiser ampliar

Conforme Observado no item 2, em linguagens Orientadas a Objeto, o acesso a HD é muito baixo, pois todo programa se encontra em RAM portanto:

Exemplos Java,Linguagem Java, Programação, Java
Clique na imagem se quiser ampliar

Essa diferença é explicita agora, EM Orientação a Objetos os dados e as funções em si ficam Juntos(RAM), ja em Estrutural os dados ficam em meios diferentes das funções em si(Como se fosse um programa dividido em 2 partes – RAM E HD).

6- Gerenciamento automático de memória:

Estrutural: Em linguagens Estruturais não tenho gerenciamento de memória, ou seja a alocação e desalocação de memória fica a encargo do programador. Em muitos casos acontece oque chamamos de memory link ou seja memória presa ao programa que não tem mais uso a ele e que não foi desalocada pela programador.
Orientado a objetos: Em java temos o Garbage Collector(GC) que é quem faz a desalocação automática de memória deixando a cargo da Arquitetura de java a desalocação de memória e não ao programador.

7- Ponteiros:
Estrutural: Temos o conceito de ponteiro a estrutura
Orientado a objetos: Temos o conceito de Referência ao objeto

É Fundamental Intender:

Paradigmas Diferentes não significa melhor e nem pior, TUDO depende da Implementação do código que você usará. É importante saber intender e principalmente valorizar as diferenças. Nada é Pior e nem melhor, apenas tem sua utilidade diferenciada.
Com o paradigma Orientado a Objetos surge o Conceito de componentização(ir em busca de um componente(objeto), fazer a junçar de componentes(objetos)) e surge um Conceito de que a maioria dos softwares hoje em dia são OBJETOS COMPUTACIONAIS.
Olhando um programa de uma forma abstrata, dividindo ele em 2 partes:
– Dados
– Funções
O paradigma estrutural trabalha com Dados em HD, Funções em RAM(Os dados e as funções são do programa todo). Orientação a objetos trabalha com dados e funções em RAM(Cada Objeto tem seus Dados e suas funções).
No paradigma Orientado a Objetos, Um programa é um conjunto de objetos, e cada Objeto não sabe e nem quer saber do outro. Abstraindo da vida real é como se fosse uma relação entre duas pessoas..Uma dia a outra: Eu nem sei e nem quero saber da sua vida, cada um com seus problemas.(Infelizmente na vida real nem sempre ocorre isso!)

Paradigma Orientado a Objetos e Abstrações do mundo real:

Antigamente tinha-se em mente o conceito de “Fabricantes de Automóveis” pois, a Fábrica fabricava carros. Se você observar hoje em dia temos o CONCEITO MONTADORA DE CARROS(Essas grandes empresas não fabricam carros elas montam, todas as peças(componentes,objetos) ja estão prontos), com o Conjuntos de objetos do carro(motor, roda etc) ja estão prontos, elas simplesmente MONTAM OS OBJETOS NO CARRO, sendo assim uma MONTADORA DE CARROS.

Importante saber diferenciar:
Implementar = Construir algo
Implantar = Colocar algo ja construido para FUNCIONAR

Esse post é só uma introdução entre as diferenças de Paradigmas, conceitos de Orientação de objetos ja introduzindo a linguagem de programação JAVA

Entendendo Java Através de Desenhos e Arquitetura da JVM

Entendendo Java Através de Desenhos e Arquitetura da JVM. Linguagem Java.

O real Intuito dessa minha sequência de posts será Ensinar java mostrando na Arquitetura da JVM oque acontece, É importante seguir a sequência.

1 – Teoria Geral dos Sistemas, Paradigmas conceituados, Estrutural x Orientação a objetos

Entendendo Java Através de Desenhos e Arquitetura da JVM

Java Princípios Básicos Voce Tem que saber

Java Princípios Básicos Voce Tem que saber. Linguagem Java.

Princípios Básicos:

São Conceitos e ou você os tem, ou nem sabe por onde começar !!!

Oque é Lógica de programação?Tudo abaixo faz parte dessa Técnica

É técnica de encadear pensamentos para atingir um determinado escopo(pré definido). Ela é apenas conceitual diríamos assim!

Oque é Lógica?

Maneira de raciocinar particular a um indivíduo ou a um grupo, que gera uma seqüência coerente com a finalidade de obter uma solução prática eficaz para um escopo.

Oque é Programa?

É um algoritmo em uma linguagem de programação

Oque é um processo?

É basicamente um programa em execução, quando você manda executar ou interpretar o seu programa o Sistema Operacional trata ele como um processo. Todo S.O tem um monitor de Sistema onde existe a aba de processo que, você’ encontra todos os processos(ou seja programas em execução)

no seu S.O

Oque é um Sistema?

É um conjunto de programas.

Oque é Algoritmo?

Seqüência finita de instruções com um escopo previamente determinado

Oque são instruções?

São determinações de ações que serão tomadas a partir do que você determinou, é um ordem

Oque é escopo?

Também conhecido como domínio do problema, é o objetivo ao qual você se propõe a resolver, é o objetivo final.

Oque é Seqüência Lógica?

É um passo a passo ordenado de instruções a fim de resolver o escopo do problema.

Oque é Pseudocódigo?

É uma maneira genérica de escrever algoritmos sem a necessidade de conhecer nenhuma linguagem de programação.

Oque é Teste de mesa?

É fazer o teste do seu programa antes de implementá lo e contrabater com o escopo do problema e ver ser o escopo final atende ao escopo inicial.

Oque é Linguagem de programação?

É um idioma com Sintaxe e gramática própria que faz o intermédio entre a linguagem falada pelos humanos e a linguagem falada por máquinas(binário).

RESUMINDO

Você cria instruções em uma linguagem de programação, ordena em uma seqüência lógica e isso é o seu programa.

Oque é Paradigma de Programação?

  • Modelo, padrão ou estudo de programação suportado por linguagens que agrupam certas características comuns

  • A Classificação de linguagens em paradigmas é uma conseqüência de decisões de projeto que muda a forma como a aplicação será modelada no ponto de vista computacional

  • EXEMPLO JAVA é do PARADIGMA DAS LINGUAGENS ORIENTADAS A OBJETOS

Oque são Tradutores?

O computador só entende linguagem binário logo usamos para Programar Linguagens que abstraem o código binário e criam um estrutura mais amigável ao ser Humano…Mesmo porque ninguém consegue programar em Binário pois bem, Então precisamos de algo que TRADUZA da linguagem que escrevemos para a Linguagem de máquina:

  • Compilador : É um programa ou um conjunto de programas que a partir de um código Fonte(Código escrito em alguma linguagem de programação) cria um outro programa esse, com mesma instruções porem em novo código.

  • Interpretador: Lê código fonte e os vai executando

  • RunTime: É a máquina Virtual faz a emulação de um outro S.O. no seu S.O, falaremos mais disso DEPOIS ainda não é o momento.

Porque os computadores trabalham com binários?

Porque os circuitos que compõem o computador tratam apenas de abrir ou fechar um caminho para a energia passar ou ou trafegar, desta forma vários caminhos abertos e fechados compõem uma informação com bilhões de combinações. O princípio básico é:

Quanto mais simples a solução mas rápida a resolução então fica muito mais fácil ligar com 0 e 1(ligado e desligado, pode ou não etc.), e também pelo fato de debugar erros, em uma transação de dados caso ocorra algum erro o receptor tem a condição se corrigir o erro já que: Se não é 0, é 1!!!

Oque são Binários?

Os computadores entendem PULSOS elétricos , positivos ou negativos que são representados por bits.

Oque é um bit?

É a representação desses pulsos em números… 0 ou 1

Oque é um byte?

1 byte = 8 bits

Porque do nome Computador?

Antigamente o nome “computador” era um título de trabalho, uma profissão(predominantemente desempenhada por mulheres), os detentores dessa profissão se encarregavam de efetuar cálculos repetitivos. Como era um trabalho manual, a lentidão e os erros eram imensos. Por isso, durantes anos os cientistas procuravam formas de mecanizar isso.

Então a principal característica dos computadores e o que os distingue das outras máquinas, é que podem ser programados. Isso significa que um algoritmo escrito em uma linguagem de programação pode ser armazenado em memoria e executado posteriormente. A pessoa que gera algoritmos em uma linguagem de programação(ou seja da instruções ordenadas com um escopo pré determinado) a um computador é CHAMADO DE PROGRAMADOR.

Basicamente oque faz um processador?

Não vou me ater a muitos fatos, vou dizer oque realmente importa ao momento. O processador é o cérebro do computador, ele que executa (ou “processa”) todas as ações que você faz no seu computador. Ele trabalha com linguagem binária e transforma tudo em binário

Basicamente oque faz a memoria RAM?

É chamada de memória volátil, esta diretamente ligada ao processador. Ela armazena dados aos quais o processador esta trabalhando no momento.

Basicamente oque faz a memoria Secundaria?

É uma memoria não volátil, é ligada diretamente a Memoria RAM. DADOS A LONGO PRAZO.

Oque é Codificar?

É pegar o seu PseudoCódigo e começar a escreve-lo na Linguagem a qual você deseja.

Oque é Debug?

Na maioria das vezes, depois do programador ter escrito o programa, este poderá não estar funcionando 100% no início. O programador deve corrigir o programa no caso de erros(também conhecidos como Erros de Compilação) que ocorrem no programa. Esse processo é chamado de depuração de erros(debug).

Oque são erros de Compilação?

Erros de Sintaxe do código, ou seja você escreveu algo errado

Oque são erros de Tempo de Execução?

São erros de lógica. Você fez a Sintaxe do código certa, porem erro na lógica.

Oque é Metodologia?

São “formas” a serem seguidas visando uma melhoria no processo de Criação de seus sistemas

ex: RUP,XP, SCRUM,

Conceitos Básicos sobre linguagens de Programação:

já sabemos oque é uma linguagem de programação , agora vamos ver alguns conceitos, podemos classifica-las como:

Quanto ao paradigma

Diferentes linguagens de programação podem ser agrupadas segundo o paradigma que seguem para abordar a sua sintaxe:
  • Linguagem funcional

  • Programação estruturada

  • Linguagem orientada a objetos

  • Linguagem natural

  • Programação lógica

  • Programação imperativa

Quanto à geração

  • Primeira geração, as linguagens de baixo nível (Assembly)

  • Segunda geração, as primeiras linguagens (Fortran, ALGOL,…)

  • Terceira geração, as procedurais e estruturadas (Pascal, C).

  • Quarta geração, linguagens que geram programas em outras linguagens (Java, C++), linguagens de consulta (SQL).

  • Quinta geração, linguagens lógicas (Prolog).

Aspecto de estudo das Linguagens de programação:

  • Sintaxe = Gramática

  • Semântica = Significado

  • Pragmática(Paradigma)

Keep ur mind !!!

É só o básico para poder realmente intender oque vem por ai!!!

CYA DUDES!

Java Operadores Prioridade de Operadores Pré/Pos Incremento/Decremento

Java Operadores Prioridade de Operadores Pré/Pos Incremento/Decremento. Linguagem Java.
Quais são os Operadores em java?
Source: http://java.sun.com/docs/books/tutorial/java/nutsandbolts/opsummary.html

Simple Assignment Operator

= Simple assignment operator

Arithmetic Operators

+ Additive operator (also used for String concatenation)
– Subtraction operator
* Multiplication operator
/ Division operator
% Remainder operator

Unary Operators

+ Unary plus operator; indicates positive value (numbers are positive without this, however)
– Unary minus operator; negates an expression
++ Increment operator; increments a value by 1
– Decrement operator; decrements a value by 1
! Logical compliment operator; inverts the value of a boolean

Equality and Relational Operators

== Equal to
!= Not equal to
> Greater than
>= Greater than or equal to
Conditional Operators

Condition Operators

&& Conditional-AND
|| Conditional-OR
?: Ternary (shorthand for if-then-else statement)

Type Comparison Operator

instanceof Compares an object to a specified type

Bitwise and Bit Shift Operators

~ Unary bitwise complement
> Signed right shift
>>> Unsigned right shift
& Bitwise AND
^ Bitwise exclusive OR
| Bitwise inclusive OR

Precedência de Operadores em java:
Source: http://www.uni-bonn.de/~manfear/javaoperators.php

Prioridade

Operador

Operação


1

[ ]

array index

( )

method call

.

member access – 1


2

++

pre- or postfix increment

pre- or postfix decrement

+ –

unary plus, minus

~

bitwise NOT

!

boolean (logical) NOT

(type)

type cast

new

object creation – 2

3

* / %

multiplication, division, remainder

4

+ –

addition, substraction

+

string concatenation -4


5

signed bit shift left

>>

signed bit shift right

>>>

unsigned bit shift right – 5

6

less than, less than or equal to

> >=

greater than, greater than or equal to

instanceof

reference test – 6

7

==

equal to

!=

not equal to

8

&

bitwise AND

&

boolean (logical) AND

9

^

bitwise XOR

^

boolean (logical) XOR

10

|

bitwise OR

|

boolean (logical) OR

11

&&

boolean (logical) AND

12

||

boolean (logical) OR

13

? :

conditional – 13


14

=

assignment

*= /= += -= %=


>= >>>=


&= ^= |=

combinated assignment


(operation and assignment)

Oque tudo isso significa?

Java Operadores Prioridade de Operadores Pré/Pos Incremento/Decremento

Que a precedência de Operadores é IMPORTANTE, pois dependendo muda o resultado.

int c = 25 – 5 * 4 / 2 – 10 + 4; c aqui recebe 34

int c = 25 – ((5 * 4) /2)) – 10 + 4; c aqui recebe 9

Quero abrir um espaço para falando Somente sobre o Operador de Incremento e Decremento(++ e –):
– Quando estão sozinhos, eles são a mesma coisa que acrescentar 1 Porem:

Pré Incremento: Incrementa quando aparece o operador
Pós Incremento: Incrementa somente na Instrução de baixo

Pré Decremento: Decrementa quando aparece o operador
Pós Decremento: Decrementa somente na Instrução de baixo

Exemplo:

int b = 2;
++b; // Pré Incremento , b = 3

int b = 2;
b++; //Pos Incremento, b = 2
int a = b; //Aqui o b vale 3

Mesma coisa com Decremento.

AGORA QUANDO ELE são usados com algum Operador, a coisa muda.

int b = 2;
int c = ++b;// b = 3, c = 3.

int b = 2;
int c = b++;// c = 2, b =3(Somente na proxima Instrução)
Proxima Instrução

Explicando oque aconteceu:

Em:

int b = 2;
int c = ++b;

Temos em bytecode:

0: iconst_2
1: istore_1
2: iinc 1, 1
5: iload_1
6: istore_2
*As explicações estão no tutorial: Básico sobre bytecodes

Suponto que estamos usando o método main, veremos oque ocorre no Frame, Lembre-se que o index 0 da local variable é uma Referência a Constant Pool

0: iconst_2:
Exemplos Java,Linguagem Java, Programação, Java
Clique na imagem para ampliar

1: istore_1

Exemplos Java,Linguagem Java, Programação, Java
Clique na imagem para ampliar

2: iinc 1, 1

Exemplos Java,Linguagem Java, Programação, Java
Clique na imagem para ampliar

5: iload_1

Exemplos Java,Linguagem Java, Programação, Java
Clique na imagem para ampliar

6: istore_2

Exemplos Java,Linguagem Java, Programação, Java
Clique na imagem para ampliar

Sendo b index 1 da Local Variable, c index 2 da Local Variable, temos b e c com o valor de 3.

Veremos o próximo:

int b = 2;
int c = b++;

Temos em Bytecode:

0: iconst_2
1: istore_1
2: iload_1
3: iinc 1, 1
6: istore_2
0: iconst_2:
Exemplos Java,Linguagem Java, Programação, Java

1: istore_1

Exemplos Java,Linguagem Java, Programação, Java

2: iload_1
Exemplos Java,Linguagem Java, Programação, Java

3: iinc 1, 1

Exemplos Java,Linguagem Java, Programação, Java

6: istore_2

Exemplos Java,Linguagem Java, Programação, Java

Sendo b index 1 da Local Variable, c index 2 da Local Variable, temos b = 3 e c com o valor de 2.

E se tivermos mais de um operador Unário?

int b = 3;
int c = b++ + 1;

Vamos em ordem de Precedência de Operadores:
1 – Primeiro Operador de Pos Incremento:
c = 3 + 1 = 4;
b = 4;

Outro Exemplo:

int b = 2;
int c = b++ + ++b;
Vamos em ordem de Precedência de Operadores:

1 – Primeiro Operador de Pos Incremento:
int c = 2 + ++b; -> Aqui quando ele carrega o b, ele ja tem o valor de 3
pois ja é a próxima instrução
b = 3;(na Próxima instrução)

2 – Primeiro Operador de Pos Incremento:
int c = 2 + 4 = 6
b = 4;

Em bytecode Temos: Sendo b index 1, c index 2 da Local Variable

Code:
0: iconst_2
1: istore_1
2: iload_1
3: iinc 1, 1
6: iinc 1, 1
9: iload_1
10: iadd
11: istore_2

0: iconst_2

Exemplos Java,Linguagem Java, Programação, Java

1: istore_1

Exemplos Java,Linguagem Java, Programação, Java
2: iload_1

Exemplos Java,Linguagem Java, Programação, Java

3: iinc 1, 1

Exemplos Java,Linguagem Java, Programação, Java

6: iinc 1, 1
Exemplos Java,Linguagem Java, Programação, Java

9: iload_1
Exemplos Java,Linguagem Java, Programação, Java

10: iadd
Exemplos Java,Linguagem Java, Programação, Java

11: istore_2
Exemplos Java,Linguagem Java, Programação, Java

Curiosidade:
O Operador % remain é chamado MOD.

Exemplo:
2 % 2 = 0 pois a conta é exata
3 % 2 = 1 pois para a conta dar certa so posso ir ate o 2
1 % 2 = 1 quando é menor é sempre ele mesmo


Bom basicamente era essa a intenção, Próximo Post, cast,Promoção em tipos primitivos.
Cya DUDES!

Java Entendendo Threads Comunicação entre threads

Java Entendendo Threads Comunicação entre threads. Linguagem Java. Comunicação entre threads:

Sumario: yield(),wait(), notify(), notifyAll()

Método de comunicação entre escalonador threads e threads threads:

YIELD:

package: java.lang.Thread;

static void yield() – yield(cede) , Yield da uma chance para que outra thread de mesma prioridade que esta no estado RUNNABLE possa se tornar RUNNING. Se nenhuma outra thread de mesma prioridade (Porque de mesma prioridade? Porque se for de menor prioridade ela nem entrará mesmo, e se for de maior, com ou sem yield() ela entrara) estiver no pool de RUNNABLE, então nada acontecerá.

Java Entendendo Threads Comunicação entre threads

WAIT E NOTIFY:
package: java.lang.Object;

São métodos do OBJETO, que ajudarão na comunicação de threads.

– Principio básico sobre wait() e notify():

1 – thread A necessita de uma certa condição e assume que thread B fará para ela.

2 – Quando thread B termina a condição ela notifica thread A, porem, isso não quer dizer que thread A será a thread RUNNING, continuara com B.

– Eles são preservadores de recursos, Vamos a um exemplo:

***Supondo que temos um E-commerce porem temos somente 1 produto para vender no momento, o produto é tao bom que 400 consumidores querem o produto(mais so temos 1 em estoque) – Sendo produto 1 thread, e cada consumidor 1 thread(ou seja 400 threads). Faz mais sentido eu deixar 399 threads em CPU intensive( ou seja em um loop procurando por threads produto ate achar) ou simplesmente eu deixo todas as threads consumidores(399) em uma fila de espera chamada: Bloqueado em pool de espera do objeto, onde quando houver mais 1 thread produto eu notifico elas, consumindo mais uma da fila e assim por vez!!!!????

Abstraindo wait e notify x I/O intensive:

Conversa entre Pessoas:

Ja esteve no carro um dia com seu filho, e ele ficava perguntando:

– Pai ja chegou?
– Não!
e de novo ele pergunta
– Pai ja chegou?
e de novo você responde:
– Não!
e de novo ele pergunta
– Pai ja chegou?
e de novo você responde:
– Não!

e de novo ele pergunta
– Pai ja chegou?

e você fica bravo com tantas perguntas e diz, fica ESPERANDO que quando chegar eu te aviso!

*** Basicamente deixa a thread em um bloqueio de stack, porque tem uma frame(a frame referente ao wait()) que bloqueia o top da stack por um determinado tempo ou notificação que nem read(), readLine() fazem. – So que essa frame normalmente esta em um bloco sincronizado, então a frame bloqueada, é a anterior a ela por causa da necessidade de verificação do synchronized.

void wait() – Aguarda até que uma condição ocorra. Este é um método da classe Objeto e deve ser chamado DE DENTRO DE UM METODO OU BLOCO SINCRONIZADO.

void notify() – Notifica uma thread que estava esperando, de que a condição ja ocorreu(Somente notifica, deixando assim a thread que estava esperando a condição no ESTADO “BLOQUEIO EM POOL DE BLOQUEIO DE OBJETO”, explicando, o método/bloco é synchronized e a thread que invocou notify() ja é a thread com a chave do objeto, então a outra é notificada mais fica no “BLOQUEIO EM POOL DE BLOQUEIO DE OBJETO” POIS ela não tem a chave do objeto. Este é um método da classe Objeto e deve ser chamado DE DENTRO DE UM METODO OU BLOCO SINCRONIZADO.

passo a passo da explicação acima:

thread A e B compartilham o mesmo Objeto:

thread A invoca myObject.wait() entrando assim no estado “Bloqueado em pool de espera do objeto”
thread B esta no estado Running agora
thread B entra em um bloco SINCRONIZADO e invoca myObject.notify()

thread A entra no estado “Bloqueado em pool de bloqueio de objeto”

thread B sai do BLOCO SINCRONIZADO e Thread.sleep(100)

thread B entra no estado Bloqueado

thread A agora entra no estado Executável, existe a avaliação do Escalonador

thread A agora entra em estado EM EXECUÇÃO

Qual é o proposito de wait e notify?

É um mecanismo sincronizado , cada objeto em java tem(Lembre-se que qualquer classe is a Object), POREM é um mecanismo de COMUNICAÇÃO. Deixa uma thread aguardando por uma condição, e outra avisa quando ocorrer.

Oque acontece com a thread na qual um objeto invoca wait() ?

Ela vai para um POOL, chamado “BLOQUEIO EM POOL DE ESPERA DO OBJETO”, E so sai de la, Quando a Thread que invocou notify() for bloqueada ou sair do bloco SINCRONIZADO, ja que as 2 são do mesmo objeto e em blocos sincronizados o acesso ao bloco so pode ser dado a uma thread por vez.

Quem notify para o wait?

Claro o mesmo objeto que aguarda, será na outra stack(thread) uma referencia que notifica.(Se na Stack A, objeto1 invoca wait(), na Stack B o mesmo objeto1 deve ter uma referencia la para invocar notify()). LEMBRE-SE POREM O OBJETO tem que ser Runnable de ambas as threads, ou fazer referencia em ambas.

Que condição preciso ter para invocar wait ou notify?

O método ou bloco que invocar wait() ou notify() deve ser synchronized, para evitar o round-robin(claro e o timeSlicing).

Noque devo me atentar?

A invocação de notify() só tira uma thread do estado “BLOQUEIO EM POOL DE ESPERA DO OBJETO” porem , COMO A THREAD QUE invocou notify() esta em um bloco sincronizado do mesmo objeto, a thread que estava wait() vai para o estado “BLOQUEIO EM POOL DE BLOQUEIO DE OBJETO” por falta da chave para acesso…E é importante também ter cuidado ao usar SLEEP() etc, pois pode ocorrer da thread ir dormir com a chave…Então de preferencia a usar wait() e notify() em blocos sincronizados.

Alguma consideração a mais?

Alem de não invocar sleep() em blocos sincronizados(Pois a thread pode ir dormir com a chave) por isso prefira wait() e notify(), Use comandos de bloqueio como sleep() etc no código da thread que dará a chance a outra para entrar, POREM CLARO em blocos não sincronizados.

Quem realmente fica em wait()?

Como eles estão em bloco sincronizado, a instrução que invocou que fica, pois é necessária a verificação novamente, PORQUE uma thread que estava no “BLOQUEADO EM POOL DE ESPERA DO OBJETO” quando sai de la entra no estado “BLOQUEADO EM POOL DE BLOQUEIO DE OBJETO” a qual so sai de la quando, a thread que esta com a chave liberar.

Exemplo:

public void run(){

for(int i = 0; i

myJob.get();

}

}

Esse método run() é de uma thread e abaixo temos a implementação do método que é o RUNNABLE da thread(ou seja o Job dela).


public synchronized void get(){

if(!flag){

try {

wait();

} catch (InterruptedException ex) {

Logger.getLogger(MyJob.class.getName()).log(Level.SEVERE, null, ex);

}

}//end of if


System.out.println(“Get: ”+dados);

flag = false;

CASO A FLAG SEJA false logicamente entra no bloco if, e a instrução wait(); da o bloqueio em myJob.get() – (Claro a instrução wait() esta dentro do bloco if, porem o bloqueio é na invocação); o contador(pc do PC Register) esta sabendo certinho o valor de i…É como começar a invocação do ponto onde terminou.

Pois bem a thread no wait() entrou em Bloqueado em pool de espera do objeto, quando o objeto em outra thread deu notify() essa thread foi para Bloqueado em pool de bloqueio de objeto(Pois a chave do cadeado do objeto estava com a outra thread.). Quando a outra thread saiu do bloco/método sincronizado a chave foi liberada e daí sim a outra thread que estava bloqueada pode entrar na instrução.

Oque é flag?

Flag é como se fosse um demarcador, ex:

boolean test = true;

while(test)

{

i++;

Faz a demarcação, É como se fosse um verificador periódico; Ou apenas um teste de se CASO OCORRA.

NOTIFYALL –

Simplesmente notifica todas as threads que estão no Bloqueado em pool de espera do objeto“ REFERENTES AQUELE OBJETO.. Muito cuidado ao usar. Lembre-se também que deve ser invocado de dentro de um método/bloco sincronizado.

Dicas:

static void yield()yield(cede) , Yield da uma chance para que outra thread de mesma prioridade que esta no estado RUNNABLE possa se tornar RUNNING.

– Agora temos os estados:

Exemplos Java,Linguagem Java, Programação, Java

Clique na Imagem para maximizar

* Novo – Quando você instancia um objeto thread

* Executável – start() em um novo objeto thread ou quando volta da maioria dos estados

* Bloqueado – Thread.sleep()

* Bloqueado em pool de bloqueio de objeto – quando uma thread tenta entrar em um método/bloco sincronizado porem outra thread ja esta usando(ou seja fecho o acesso) então não temos a chave, ela fica nesse estado

* Bloqueado em pool de espera do objeto – Quando é dado wait() em um objeto a thread fica nesse estado

* Inativo – Dead é quando a thread terminou o code_block de run() seja normalmente ou prematuramente

* Em execução – É a thread que esta sendo executada(Usando A CPU) no real momento.


wait() – Object.wait() Faz com que uma thread fique no estado – Bloqueado em pool de espera do objeto – Aguardando pela chamada de notify() do mesmo objeto…Object.notify().

notify() – Tira uma thread do estado – Bloqueado em pool de espera do objeto -e faz com que ela fique no estado – * Bloqueado em pool de bloqueio de objeto – Pois o método/bloco é sincronizado e a thread que invocou notify() ainda esta nométodo/bloco fazendo com que a outra fique em aguardo no novo estado.

De preferência a uso de flags em seu código.

– Ao usar métodos/blocos sincronizados de preferência a invocação de wait() e notify() ja que invocações como sleep() podem causar danos como: Uma thread ir dormir com a chave do OBJETO e outra thread quer acessar o método/bloco porem não pode. Então cuidado ao usar Thread.sleep() em contexto sincronizado.

– Para evitar possíveis problemas de obtenção e liberação das chaves dos cadeados dos Objetos, Libere as chaves na ordem Inversa na qual você obteve.

Sempre divida tarefas em threads, melhora o uso da CPU e a distribuição do trabalho.

– Alguns métodos como read(), readLine() etc, deixam a Stack da thread atual noque chamamos de I/O intensive, a Stack fica realmente parada esperando alguma I/O.


PARA UTILITÁRIOS SOBRE THREAD, BUSQUE INFORMAÇÕES NO PACOTE

java.util.concurrent; > inclusive existem classes que facilitam a criação de threads e inclusive o manuseio.


Java Metodologias de Sistemas Objetos Classes

Java Metodologias de Sistemas Objetos Classes. Linguagem Java.

Sumário: Metodologia de Sistemas,Objetos,Classes

– O fundamento é não so ensinar Orientação a Objetos mais também a Arquitetura de JAVA(aqui eu não vou impor nada, vou dizer da onde vem) Importante intender que esses tutoriais se baseiam totalmente na Plataforma JAVA.
– Não considero um bom tutorial para se aprender, mais por curiosidade. Muitas coisas você pode até não saber como funciona, mais usa, mesmo porque muita gente usa a Lâmpada mais nem imagina como funciona a eletricidade certo?

Advertência: É necessária a leitura do(s) Post(s): Princípios Básicos: Voce Tem que saber e Teoria Geral dos Sistemas, Paradigmas conceituados!

Oque é uma Metodologia?
É um ciclo de vida no desenvolvimento do seu Programa. Programadores não setam e começam a desenvolver um programa ao invez disso, eles seguem um planejamento, um CICLO DE vida que é seguido.(Temos varios tipos de Metodologias, aqui darei exemplo de um TIPO).

Oque é escopo?
Domínio do problema * oque é que voce vai fazer* Qual o motivo daquilo

Qual será a Metodologia escolhida?

Eu realmente não tenho muito conhecimento sobre metodologias a fundo. De um modo geral resumi muitas as quais eu ja usei em uma muito simples(Desculpa se ja existe uma com essa ideia abreviada, ISSO não fui eu que inventei, é um RESUMO):

Exemplos Java,Linguagem Java, Programação, Java
Clique na figura para ampliar

Especificações = Classes

Análise -> É a definição concreta do escopo(domínio- Oque é!!!-) do seu problema. Um programa é feito em cima de uma NECESSIDADE(Essa necessidade é determinada no ESCOPO do problema). É um processo da análise de todas as necessidades referentes ao problema.

Projeto(Design) – Pega-se todas as necessidades encontradas na etapa de Análise e cria-se ESPECIFICAÇÕES que tem como objeto resolver o domínio do problema.

Codificação(Desenvolvimento) – Todas as especificações criadas no estágio de Projeto agora se tornarão OBJETOS.

Testes – Assegura que, a Junção de objetos criados na CODIFICAÇÃO resolve o domínio do problema(as necessidades) que o processo de análise encontrou.

Implementação – Com o programa ja pronto, Existe a disponibilização para os Clientes.

Trabalharemos aqui da seção Projeto em diante, o processo de Análise é importante(Alias o mais) porem não faz parte do Intuito desse Tutorial:

Executar e Testar fazem parte da Fase de Testes

Oque é um programa em java?

Um Conjunto de Objetos.(Que juntos são capazes de RESOLVER ou dominio do problema(FASE DE ANÁLISE da Metodologia))

Oque é um Objeto?
É uma abstração de algo.Qualquer elemento capaz de ter COMPORTAMENTO e CARACTERÍSTICA.(Lembra-se de DADOS E FUNÇÃO do post Teoria Geral dos Sistemas, Paradigmas conceituados!? É a relaçao!!!) – Todo objeto tem duas coisas,ATRIBUTOS(CARACTERÍSTICAS) MÉTODOS (COMPORTAMENTO) – So precisa disso agora em mente, um OBJETO TEM 2 coisas.

Desenhando e aprendendo:

Exemplos Java,Linguagem Java, Programação, Java
Isso é um objeto, clique na imagem para ampliar

Oque são Atributos?
São características do Objeto,O valor atribuido a um atributo é referenciado como o estado do objeto.
Vamos a um Exemplo:

– Um objeto TV, tem o Atributo – COR – sua tv tem uma cor certo?

Oque são Métodos?
São Comportamento. Vamos a um Exemplo:
– um objeto TV, tem o coportamento – Ligar – você pode ligar sua tv certo?

Desenhando e aprendendo: Exemplos Java,Linguagem Java, Programação, Java
Isso é um objetoTv Sem estado no atributo cor que sabe Ligar, clique na imagem para ampliar

Onde eu armazeno Atributos no Objeto?
Em Variaveis de Instancia – Por enquanto so saiba isso, Atributos estão nas variaveis de Instancia.(É pessimo o começo, cada hora eles dão um nome para um coisa, dão a volta ao mundo para não complicar, e COMPLICA MAIS AINDA). Variaveis Atributos guardam o ESTADO DO OBJETO.

Como eu crio objetos?
Na fase 2 Projeto(Design) – Temos o conceito de ESPECIFICAÇÃO, cria-se um MOLDE para que seus objetos sigam.Na biologia temos o conceito de classe exemplo: mamíferos, caninos etc(Ou seja todo OBJETO que tenha CARACTERISTA(Atributos em COMUM)). Então cria-se uma classe para dela se CRIAR um objeto.

Oque é uma classe?
É uma especificação. Com uma Classe você pode criar Objetos, a Classe é uma especificação para Objetos isso significa, que é como a JVM irá construir os seus Objetos.
A jvm pega essa Especificação(Classe) cria os seus objetos e preenche os atributos dos objetos(que vai representar o estado do objeto).

Onde moram os Objetos?
Isso é um nivel um pouco alto para quem esta aprendendo agora, porem eu acho muito melhor você aprender desenhando doque lendo,lendo,lendo,lendo e so lendo. Basicamente Objeto vivem na HEAP.Temos 2 áreas básicas que você tem que aprender, LOCAL VARIABLE E HEAP.(Local Variable e heap fazem parte da Arquitetura da JVM).

Desenhando e aprendendo: Exemplos Java,Linguagem Java, Programação, Java
Toda vez que for fazer algum Objeto, desenhe isso!!!

Processos em java:
Sabemos que um programa em execução vira processo. Todo processo tem ao menos uma thread(Não precisa estudar thread em java para saber isso!!!).

Desenhando e aprendendo:
Exemplos Java,Linguagem Java, Programação, Java

Kernel é o gerenciador de Recursos e tarefas do S.O. so precisa saber isso. Ele que “controla”.Clique na imagem para ampliar

Oque temos basicamente em uma thread?
Resumindo e somente para utilidade, toda thread tem uma STACK. Então todo processo tem ao menos uma thread, toda thread tem uma STACK.

Desenhando e aprendendo: Exemplos Java,Linguagem Java, Programação, Java
Clique na imagem para ampliar

Oque eu tenho dentro da Stack?
Toda Stack tem métodos. O método que será executado é aquele que esta no fim da STACK. O primeiro método que aprenderemos é o main. Se você não tiver o main, consequentemente não tem um método no fim da Stack, consequentemente não tem um programa que poderá ser PROCESSO.
Nesse exemplo sim, AGORA TEMOS UM PROGRAMA QUE PODE SER PROCESSO.
Exemplos Java,Linguagem Java, Programação, Java
Clique na imagem para ampliar
Qual a relação Heap Local Variable e Stack?

Farei uma coisa ruim, porem farei. Todo Objeto mora em Heap, logo todo processo mesmo que não use, TEM HEAP. Todo processo tem ao menos uma thread, toda thread tem uma STACK. Toda Stack trabalha empilhando Métodos(Toda vez que um método é invocado(Chamado, O método ta na hora de trabalhar!!!), o método entra na STACK.E o método main é invocado automaticamente). Todo método tem uma área que se chama LOCAL VARIABLE.(Só precisa saber disso.)

O intuito é, mostrar oque é um objeto, oque é uma classe, oque é um PROCESSO e oque um PROCESSO EM JAVA PRECISA. No começo é meio confuso, mais Conforme o tempo te garanto que o entedimento doque esta fazendo, supera o de muita gente com experiência.

Erros de compilação:
Todos os erros de compilação são erros de Sintaxe e Semântica ou seja erros na estrutura da Classe.
Exemplo: faltando ; , faltando { } .

É hora da revisão:
– Todo processo tem ao menos uma thread(Não precisa saber de threads de java para saber isso)
– Toda thread tem uma Stack
– Toda Stack tem que ter um método que esta no fim dela, que é oque sera executado(Normalmente usamos o main)

– Local Variable,heap,Stack fazem parte da Arquitetura da JVM
– Classes são especificações para criação de objetos
– Variaveis Atributo dizem qual é o estado atual do objeto Próxima seção será mão na massa com tudo que vimos.
– Erros de Compilação são de Semântica e Sintaxe

CYA DUDES!


Java Básico de bytecode

Java Básico de bytecode. Linguagem Java.

Princípios:
Source File =
arquivo.java
Class File =
arquivo.class

Compilação:
Todo Source File gera um Class File quando compilado, ou seja Todo arquivo.java Compilado será um arquivo.class

– Cada Class File Contem Instruções, cada instrução possue um opcode de 1 byte (por isso bytecode) e cada opcode possui 1 mnemônico distinto.

Exemplo:

public class MinhaClasse{

}

Compilando esse Source File teremos um Class File.

Como ver os bytecodes de um Class File?
javap -c IdentificadoDoClassFile

Como fazer isso nesse Source File?
javap -c MinhaClasse Vamos obter:
public class MinhaClasse extends java.lang.Object{
public MinhaClasse();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object.“”:()V
4: return

}

Um exemplo de opcode é:
aload_0 e o Mnemônico dele é: 0x9

Qual a relação Processo main?

Toda vez que você tem um processo(para ter um processo é necessário o método main), Você tem uma thread, quando você tem uma thread você tem uma STACK, quando você tem uma Stack em um processo o Frame(Método) que vai ser executado é ou main ou um outro que não falaremos agora, Lembrando que isso é para Processos via linha de COMANDO:

Vamos ao exemplo:

public class MinhaClasse{

public static void main(String[] array){

}
}

Quando você executar o processo acontecerá isso:

Exemplos Java,Linguagem Java, Programação, Java
Clique na imagem para ampliar

Mais oque é um frame?
Toda vez que um método é invocado ele vira um Frame na sua STACK.

Quem invoca o método main?
A própria Instância da JVM operando sobre a Stack


Oque eu tenho dentro da STACK?
Local Variable = Variaveis Locais ao Frame(ao método)
Operand Stack = Onde você empurra e relaciona valores, Normalmente em java trabalhamos aqui,também é usada para receber retornos de métodos e para preparar parametros para passar para argumentos.Os valores quando empurrados na Operand Stack ja tem o valor do tipo da variavel(ja tem um espaço daquele tamanho esperando aquele tamanho).
Referência a Constant Pool = Todo Class file tem uma tabela chamada Constant Pool que é Mapeada para a arquitetura da JVM para a Runtime Constant Pool, que futuramente será feito Dynamic Linking para a real construção da HEAP(isso não importa agora), é o indice 0 da local Variable que é uma Referência a Constant Pool do Class File.

Então vamos desenhar:

Exemplos Java,Linguagem Java, Programação, Java Clique na imagem para ampliar
Qual a relação disso com bytecode?
A agora vamos la, essas áreas de memoria são usadas como pilhas…Empurando e retirando valores:

Temos aqui um Source File, Por causa do método main podemos ter um processo via linha de comando

public class MinhaClasse{

public static void main(String[] array){
int x = 3;
int y = 2;
int u = x + y;

}

}

O Class File desse Source:

Compiled from “MinhaClasse.java”
public class MinhaClasse extends java.lang.Object{
public MinhaClasse();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object.“
”:()V
4: return

public static void main(java.lang.String[]);
Code:
0: iconst_3
1: istore_1
2: iconst_2
3: istore_2
4: iload_1
5: iload_2
6: iadd
7: istore_3
8: return

}

Vamos por instruções:
public static void main(String[] array){

Estamos assim:

Exemplos Java,Linguagem Java, Programação, Java Clique na imagem para ampliar
Para abreviar usarei só Local Variable e Operand Stack e os bytecodes agora:

Agora estamos na instrução:
int x = 3;
int y = 2;
int u = x + y;

e em bytecodes:
0: iconst_3
1: istore_1
2: iconst_2
3: istore_2
4: iload_1
5: iload_2
6: iadd
7: istore_3
8: return

Ou seja dentro do Frame de main


Nesse site explica oque faz os bytecodes:
http://www.brics.dk/~mis/dOvs/jvmspec/ref-Java.html

0: iconst_3 = Empura 3 na Operand Stack

Desenhando:

Exemplos Java,Linguagem Java, Programação, Java Clique na imagem para ampliar

Lembrado que o 0(zero) da Local variable é a referência a Constant Pool, simplesmente ja esta la, não se importe com ele. Ele também é conhecido como this.

1: istore_1 = Armazena o valor que estiver no Topo da Operand Stack no index 1 da Local Variable

Exemplos Java,Linguagem Java, Programação, Java
Clique na imagem para ampliar

2: iconst_2 = Empura 2 na Operand Stack

Exemplos Java,Linguagem Java, Programação, Java Clique na imagem para ampliar

3: istore_2 = Armazena o valor que estiver no Topo da Operand Stack no index 2 da Local Variable

Exemplos Java,Linguagem Java, Programação, Java Clique na imagem para ampliar
4: iload_1 = Carrega o inteiro que estiver no index 1 da Local Variable(Lembrando que java trabalha com cópias de valores(O valor é COPIADO))
Exemplos Java,Linguagem Java, Programação, Java
Clique na imagem para ampliar
5: iload_2 = Carrega o inteiro que estiver no index 2 da Local Variable(Lembrando que java trabalha com cópias de valores(O valor é COPIADO))

Exemplos Java,Linguagem Java, Programação, Java Clique na imagem para ampliar
6: iadd = Pega os 2 primeiros valores do topo da Operand Stack e soma eles

Exemplos Java,Linguagem Java, Programação, Java Clique na imagem para ampliar

7: istore_3 = Pega o inteiro que estiver no topo da Operand Stack e armazena no index 3 da Local Variable

Exemplos Java,Linguagem Java, Programação, Java Clique na imagem para ampliar


Como não há mais nenhuma instrução, termina-se o processo e perdeu-se os valores.

Isso é o bem básico sobre tudo, porem acredito que desenhando tudo fica fácil.
Bom é isso
CYA DUDES!!

Java Sincronização

Java Sincronização. Linguagem Java.

Sincronização:

* O principio desse capitulo é falar sobre o acesso de múltiplas threads ao mesmo OBJETO, ou seja, 2 chamadas de métodos/instruções em 2 stacks diferentes porem os métodos/instruções são do mesmo objeto.

– QUANDO OCORRE TIMESLICING EM THREADS QUE NÃO ACESSAM OS MESMOS OBJETOS, O PC DO PC REGISTER GARANTE QUE TODAS AS INTRUÇÕES SERÃO FEITAS. NO CASO DE 2 THREADS COM TIMESLICING NO MESMO OBJETO, o pc do PC register garante que todas instruções serão feitas, porem o problema é em qual instrução estamos.

Podemos considera-lá como um átomo, não pode ser dividida.

Descrevendo uma situação provável:

Uma objeto chamado Object, que contem um método chamado somar e outro chamado subtrair, a thread A deve invocar somar e a thread B deve invocar subtrair, porem ambas elas estão FAZENDO NO MESMO OBJETO…Lembre-se muitas vezes o escalonador não tem uma ordem certa com threads de mesma prioridade, Portanto mesmo que você faça primeiro

ThreadA.somar();

ThreadB.subtrair();

Pode ser que ocorra isso: Um timeSlicing de threads, vamos ver:

public int x = 5;

Thread A – Prioridade 5 – Incremente o valor em 5,acessando o método do objeto que praticamente faz isso:

x = x + 5;

Thread B – Prioridade 5 – Decrementa o valor em 5, acessando o método do objeto que praticamente faz isso:

x = x – 5;

Object – as Duas Threads tem o mesmo objeto como RUNNABLE

getfield #2; = Instance variable que é uma referencia dinâmica a constant Pool da classe, que sera resolvida depois…Ou seja instance variable do Objeto

VAMOS VER OQUE ACONTECERÁ:

*Thread A – usa uma parte do TimeSlicing dela, invocando somar() no Object

getfield #2

iconst_5

iadd

putfield #2

Quando o pc do pc register da method area estava na instrução iconst_5 o tempo se esgotou da THREAD A, portanto é hora da THREAD B.(Lembre-se que o mudou porque quando o pc do Pc register faz uma instrução ele salva o estado e guarda o endereço da próxima instrução)

A Operand STACK referente a Thread A esta:

5

5

———x———–

*Thread B – usa uma parte do TimeSlicing dela, invocando subtrair() no Object(Mesmo Objeto que A)

getfield #2

iconst_5

isub

putfield #2

O pc do pc register da method area estava na instrução iconst_5 mudou porque quando o pc do Pc register faz uma instrução ele salva o estado e guarda o endereço da próxima instrução)

A Operand STACK ESTA

5

5

———-x———-

*Thread A usa uma parte do TimeSlicing dela, invocando somar() no Object

getfield #2

iconst_5

iadd

putfield #2

——–>Termino da Frame.

A Operand STACK ESTA – sem nada agora, x = 10 agora.

——–x———-

*Thread B –usa uma parte do TimeSlicing dela, invocando subtrair() no Object(Mesmo Objeto que A)

Repare que, o valor de x é 10, não é mais 5, porem a atualização não acontece aqui, pois a instrução de carregar o valor(getfield #2) foi feita antes da instrução de adicionar(iadd (x = x + 5)) da THREAD A

getfield #2

iconst_5

isub

putfield #2

A Operand STACK esta vazia agora, x = 0; porem deveria ser 5, mais eu sobrescrevi o valor. (E não era essa a intenção)

Conseguiu enxergar a inconsistência de valores? eu simplesmente tinha uma instance variable, com o valor de 5

public int x = 5;

Oque era para acontecer:

Em uma thread eu gostaria de somar + 5…

x = x + 5,

x = 5 + 5;

x = 10;-> Thread A

Em uma outra thread eu gostaria de subtrair 5…

x = x – 5;

x = 10 – 5;

x = 5; – Thread B

Oque aconteceu: x = 0;

No final meu x foi para 0(e era para ser 5), houve uma inconsistência de valores, devido ao fato que temos 2 stacks acessando o mesmo OBJETO supondo que ocorra timeSlicing oque é muito provável e obviou que elas tem a mesma prioridade.

Foi como dito antes, certas coisas são como átomos, não podemos dividir.

Como consertar isso?

Bom sabemos que Garantia de haver ou não Robin-Round(claro e o timeSlicing)não podemos ter, Portanto fazemos o seguinte:

TODO objeto em java tem um cadeado, ESSE CADEADO É DO OBJETO logo esse cadeado pode estar trancado ou destrancado. Só que esse mecanismo só fica ativo quando usamos a keyword synchronized.

Quando um cadeado esta trancado?

Quando uma thread acessa um membo synchronized, ou uma instrução synchronized, A thread se tranca em um “quarto” com o objeto, e diz que só devolve a chave do quarto, QUANDO ELA TERMINAR O SERVIÇO.

E se uma threadB quer usar o Objeto, porem a threadA esta com a chave?

A thread B fica em um Pool CHAMADO: Blocked in Object’s Lock Pool. E so sai de la quando a thread A, sair do quarto e devolver a chave.

SIMPLESMENTE synchronized evita o Robin-Round(claro e o timeSlicing) referente aquele objeto, evita usando o mecanismo de tranca onde a thread fica com a chave,outras threads ate podem acessar o método, so que ficam no Object’s Lock Pool esperando a outra thread sair do “quarto” e devolver a chave.

EXEMPLO DE Método de somar e subtrair synchronized:

Object = é um objeto com uma instance variable (public int x = 5) e 2 métodos sicronizados(somar(), subtrair())

Thread A = é a Thread de SOMA

Thread B = é a thread de subtração

*Thread A entra invoca somar() do objeto Object

getfield #2

iconst_5

iadd

putfield #2

Na instrução iconst_5, terminou o time da thread A, portanto time da Thread B

*Thread B tentar entra invocar subtrair do objeto Object, POREM Não pode, pois não tem a chave para destrancar(Pois subtrair é SINCRONIZADO). PORTANTO THREAD B entra no POOL das Blocked in Object’s Lock Pool.

*Thread A volta da onde tinha parado, e continua o somar() do Object

getfield #2

iconst_5

iadd

putfield #2

agora sim, x = x + 5…x = 10; Thread A terminou o bloco de código do frame , abriu “o quarto” e devolveu a chave.

*Thread B tentar entra invocar subtrair do objeto Object, COMO thread A terminou la esta a chave, B PEGA A CHAVE, se tranca com o objeto “no quarto"e manda a ver no metodo!

getfield #2

iconst_5

isub

putfield #2

AGORA TEMOS O RESULTADO QUE QUERIAMOS, x = 5

TENHO que synchronized o método todo?

Não você pode simplesmente synchronized o código que você quer, especificando um objeto que tem a chave para aquilo.(Eles te dão a chance de ter um bloco onde se consegue garantir o termino coerentemente e onde você pode especificar outro objeto para a obtenção da tranca disso)

public void go(){

synchronized(this){

}

}

Ou declare uma instance variables somente para armazenar a Tranca dele

Object d = new Object();

synchronized(d){

}

Resumo:

– Quando duas threads acessam o mesmo objeto tenha CUIDADO, potenciais problemas podem vir a ocorrer.

– TODO OBJETO TEM UM CADEADO ASSOCIADO COM ELE.

– O cadeado e a chave dele, estão associados ao objeto … A thread simplesmente tranca ele e pega a chave, porem devolve ao OBJETO DEPOIS. Portanto 2 métodos synchronized significa só uma chave para acessar qualquer um dos dois.

– Lembre-se só sincroniza – se membros, e construtor não é considerado membro

– Quando uma thread acessa um membro synchronized do objeto, outras threads não poderão acessar SOMENTE MEMBROS synchronized DESSE OBJETO, ATE QUE A PRIMEIRA THREAD DESTRANQUE…REPITO SOMENTE MEMBROS synchronized QUE ELES NÃO PODERÃO ACESSAR.

Thread safe é estar synchronized.

– O grande problema de não fazer membros thread safe não é a questão de timeslicing mais sim das intruções que já podem ter sido feitas pelo pc do pc Register.

– Podemos fazer métodos (thread safe) ou code_blocks (thread safe), porem em questão de code_blocks é necessário especificar o objeto.

– Se for um membro static, a thread tranca os membros synchronized da classe, e só devolve a chave para a classe quando terminar.

– Quando uma thread A acessa o método/instrução sincronizada de um objeto, e thread B tenta acessar o um método/instrução sincronizada do mesmo objeto, SE thread A ainda não terminou, thread B vai para o estado “Bloqueado em pool de Bloqueio de Objeto” e so sai de la quando a devolver a chave do objeto.

Passo a passo:

1 – thread A entra em um método/instrução sincronizada do objeto1

2 – thread B tenta entrar em algum método/instrução sincronizada do objeto1(mesmo de thread A)

3 –thread B encontra um objeto1 fechado para métodos/instruções sincronizadas e não encontra a chave, thread B vai para o estado: “Bloqueado em pool de bloqueio de objeto”

4 – thread A termina o code_block(ou vai dormir em uma instrução não sincronizada) e libera a chave do objeto1

5 – thread B agora vai para o estado Executável e como só temos essa thread de maior prioridade o escalonador seleciona thread B para ser RUNNING.

Fácil sincronização neh?


Java Resumo Modelos de Escalonamento

Java Resumo Modelos de Escalonamento. Linguagem Java.

Resumo:


– O modelo de escalonamento de threads em java não é definido por uma especificação, isso significa que o comportamento varia de plataforma(Nativa) para plataforma(Nativa) e claro a implementação da JVM.


– Java é uma plataforma independente, oque implica a não necessitar saber sobre detalhes de implementação da Plataforma Nativa POREM em alguns casos os detalhes importam!

– A maioria dos computadores tem apenas uma CPU disponível oque, acarreta em escalonamento de threads mediante ao core.

– O modelo de Prioridade, é realmente o único ao qual pode-se fazer Afirmação, Na implementação das Jvms, threads com maior prioridade terão preferência para se Tornarem Running do que thread de menor prioridade.

– threads de Mesma prioridade seguem em cada S.O. E cada implementação de JVM uma idéia diferente(um modelo Diferente), cabe ao programador fazer as manipulações certas.


– O S.O Realmente importa – Em alguns casos de acordo com o Sistema de escalonamento do S.O. sera como o seu programa multiThread se comportara, então fica melhor você garantir que seu programa funcionara de acordo, usando yield(), sleep() ,wait() noticy etc… Isso para programas com mais de uma Thread Cpu Intensive



– Thread scheduling

Em programas multiThread, as threads dividem as CPUS. OU a JVM, ou o S.O. decide como dividir os CPUS e isso é conhecido como Thread scheduling. Seja a Jvm ou o S.O. é conhecido como Thread scheduling quem faz a divisão das CPUS(ou da CPU) ,o programador entra com “manipulações” dessas divisões das CPUs.


– Temos 3 tipos básicos de programas em nível de caracterização:

CPU intensive: Vários ciclos

I/O intensive: Aguarda I/O

Interactive: Evento



O escalonador de java é baseado na prioridade das threads. Isso significa que as threads são assinadas com uma certa prioridade, um valor inteiro positivo. APENAS O PROGRAMADOR pode trocar a prioridade. Ou seja se uma thread nasce com uma prioridade, mesmo que ela passe por todos os estados possíveis, ela morrerá com a mesma prioridade. – (Ou seja, 2 threads, A prioridade 5, B prioridade 6, A esta Running, B entra em Runnabl(b.start())…A e B vão para o Pool de threads Runnable, e a thread que será dada a CPU é para B, pois tem maior prioridade)-

– Temos 2 tipos de modelos de implementação de threads:


*The green-thread model – as threads são gerenciadas somente pela JVM.É o modelo mais comum.


*The native-thread model – as threads são gerenciadas pelo S.O. que é hosta da JVM(O escalonador do S.O.)


– QUANDO DEVO TOMAR CUIDADO?


– Quando tenho mais de um CPU-Intensive no programa

– Quando resultados parciais são importantes, ainda mais se eles forem compartilhados

– Quando threads não estão fazendo tarefas associadas; as threads estão fornecendo tarefas separadas que vão se integrando, ou empregando um paradigma de round-robin scheduling(Um programa de servidor que responde a requisições de diferentes usuários) ou empregando um paradigma de Escalonador(um servidor que processa requisições de usuários )




– QUANDO ACONTECE A MUDANÇA DE UMA THREAD PARA OUTRA?

NESSES CASOS:

* Uma thread de prioridade maior entre na historia

* yield() seja invocado, stop(), ou run() termine o code_blocK

* Ou em um sistema que suporte time-slicing diga que o tempo de uso terminou.


– Quando configurar a prioridade de threads é importante?

– Quando temos apenas uma CPU intensive thread(ou uma CPU somente na máquina)

– resultados intermediários são importantes

– Oque são resultados intermediários?

Ex: Temos uma thread CPU intensive(que tem um loop, que faz contas e a cada loop ele mostra para o user o resultado) e temos um thread Interactive(que fica esperando uma ação do usuário, claro temos que fazer os 2 ao mesmo tempo), então a thread que é CPU intensive ao fazer uma conta, mostra para o user o resultado(so que ela faz essa conta “n” vezes), porem cada resultado é importante, não somente o resultado final… na 1x que faz a conta sai o resultado para o user, na 2x que faz a conta sai o resultado para o user, na 3x que faz a conta sai o resultado para o user e assim por vez… Isso enquando a thread de INTERACTIVE não recebeu nenhum evento…isso que é chamado de resultado intermediario.



Round-robin é um algoritmo de escalonamento usado em computadores no qual um número determinado de processos ocorrem com um intervalo de tempo também determinado. – Ele usa aquele conceito de lista, oque estiver em cima é executado e vai para o fundo.(ELE É implementando em alguns S.O.) Dele deriva também o termo de Time-Slicing(Falando em quesitos de thread e implementação da JVM de recursos do S.O.).


Time-slicing é um termo que vem de múltiplas threads no estado “Runnable” de mesma prioridade que são as de mais alta prioridade no sistema e estão competindo pela CPU(ou seja um pc só com uma CPU, e elas querem se tornar RUNNING).


– Quando uma thread é criada, a thread herda a prioridade da thread que a criou. Você pode modificar a prioridade de uma thread a qualquer momento usando o setPriority().


– USER LEVEL THREADS X SYSTEM LEVEL THREADS:


Em grande parte dos S.O., o S.O é dividido em duas partes: User level e System level. O KERNEL do S.O. é quem responde as System level threads e também é quem representa o S.O. em chamadas de programas que rodam em User level.


Quando um programa do user quer ler um arquivo, por exemplo, o programa tem que fazer uma chamada ao kernel do S.O. o qual, lera os dados e retornara ao programa. Porque disso?

SE um programa fizer uma operação ilegal de sistema, antes disso ocorrer passa pelo kernel do S.O. oque ja sabe oque esta ocorrendo e termina o programa antes que afete outros programas ou o próprio S.O.

Por causa dessa separação é possível ter user leve threads, system level threads ou ambos independentemente.


– O GREEN MODEL:

* Normalmente são chamadas de user – level thread

* Não usa habilidades particulares a um S.O.

* Não suportam threads Nativas

* Esta na maior parte de S.O. derivado de UNIX(Embora grande parte do S.O tambem suportem native-thread model)

* As threads não são conhecidas pelo S.O – Somente a JVM sabe e gerencia

* So podemos executar uma thread por vez na CPU -Consequentemente não pegam as vantagens de multi processadores(Tendo eles ou não).

* A troca de uma thread no modelo green é muito mais rapida doque em native


– O NATIVE-THREAD MODEL:

* Normalmente chamadas de System – level thread

* Usa as habilidades nativas do S.O. para gerenciar Sistemas multiThread. Faz como de threads processos.

* Permite TimeSlicing( Atraves do escalonador do S.O. Round-robin)

* São threads que obtem do S.O. nativo algumas funcionabilidades e ajudas no processamento.

* Usa o escalonador do Sistema operacional

* Dependendo de cada S.O. as native – threads trabalham de uma maneira diferente.



Qual a diferença entre Native e Green Model?

– ISSO EM LINUX


# Em threads Nativas, a troca de uma thread a outra fica a encargo do escalonador do S.O. (de processos ex: Round-robin) em Green model não temos timeSlicing conseqüentemente também não o Round-robin(ou seja em Green Model uma thread so passa para a outra se for explicitamente dito Thread.yield(), Object.wait(), etc. Ou bloqueando código…read() etc)


# Em maquinas com Múltiplas CPUs, threads nativas podem rodar simultaneamente em mais de uma CPU. No green Model todas as threads Rodam na mesma CPU.


#Threads Nativas dão aparência de muitos processos sendo executados: Cada thread tem a sua entrada na tabela de processos do S.O.


Um programador pode determinar se o S.O usará o modelo de green threads ou System threads?


Não. O usuário pode decidir a qual pacote escolher , porem uma vez executada a thread o usuário não pode alternar de green para system e vice versa.


Como posso programar de uma maneira que seja legal a ambos, Green e Native?

Tome algumas iniciativas de “manipulação” do Escalonador, do tipo use :

yield(), sleep (),wait(), noticy() etc…De uma maneira que você se responsabiliza pelo seus atos.


Como criar uma native thread?

A Jvm cria a thread chamando Apis de OS-level.


– De tudo que observamos sobre Green e System, vemos que a escolha do pacote realmente fará a diferença, porem a mais importante é conhecer o Sistema Nativo a qual o programa multiThread será executado, pois dai tiramos um embasamento pela arquitetura do S.O e das CPUs.


– A JVM não faz timeSlicing


– Porem o S.O pode suportar TimeSlicing – Através de algoritmos como o Round – robin


– Não faça programas que confiem em TimeSlicing


– Em muitos S.O. quando temos threads de mesma prioridade no Pool de Runnable, o a JVM implementa o uso Round-robin em alguns sistemas operacionais, outros usam outros modelo de thread, ou propriamente somente o de Prioridade.


– Sistemas operacionais como windows, não tem implementação do Green model, portanto todas as threads são vistas como native thread(ou seja todas as threads são tratadas como processo e como uma native thread). – toda thread em windows é tratada como native


– Em sistemas derivados de Unix(linux etc) pode-se implementar tanto green thread como native thread.


Oque mudará se você terá green or native, é a implementação do seu código, e os packages que você usar.


CPU Starvation(inanição) é quando uma thread fica no estado de RUNNABLE muito tempo e existe pouca possibilidade dela se tornar RUNNING, normalmente pela prioridade das outras threads que estão com ela.(a dela é menor que as outras.)

– Normalmente em threads de mesma prioridade a Jvm implementa o Round-robin do S.O.


Existe uma API, java.util.concurrenty; ONDE TEMOS NOVAS IMPLEMENTAÇÕES PARA threads, alem de utilitários para a construção, REALMENTE VALE A PENA CONFERIR.

BOM voltaremos agora a Básicos threads 03…