Dúvida Sincronização thread

4 respostas
R

Ola para todos.

Bom eu tenho algumas dúvidas quanto a sincronização de thread’s.
Meu professor não é muito bom…

Bom seguinte minha dúvida é a seguinte eu tenho um programa para fazer que é multi usuarios e processos…Com Sockets

Bom minha dúvida esta, eu pensei em criar uma classe que empacotasse um ArrayList e ela tivesse metodos sincronizados…

package wrap;

import java.util.ArrayList;
import java.util.List;

public class WrapList<E>
{
	private List<E> list;
	
	public WrapList(List<E> lista)
	{
		this.list = lista;
	}
	
	public WrapList()
	{
		this.list = new ArrayList<E>();
	}
	
	public boolean addIten(E iten)
	{
		synchronized (this)
		{
			return list.add(iten);
		}
	}

	public E removeIten(int index) throws IndexOutOfBoundsException
	{	
		synchronized(this)
		{
			if (index == -1)
			{
				return this.list.remove(0);
			}
			else
			{
				return this.list.remove(index);
			}
		}
	}
	
	public boolean isEmpty()
	{
		return list.isEmpty();
	}
	
	public synchronized boolean contains(E item)
	{
		return list.contains(item);
	}
	
	public void setList(List<E> lista)
	{
		this.list = lista;
	}
	
	public List<E> getList()
	{
		return this.list;
	}
}

Teoriacamente ela serve para empacotar e sincronizar o meu array para evitar erros com minhas threads. Agora veio a dúvida, eu sei que o Vector ele é todo syncronize, então eu estou tendo um trabalho atoa reinventando a roda ou estou ganhando desempenho ou alguma coisa a mais que eu não pensei ?

Quais são as vantagens e desvantagens de eu fazer isso ?

As vezes eu resolvo fazer coisas desnecessárias queria saber se vale a pena fazer isso dai ou não ?

4 Respostas

michelantunes

Seria mais fácil fazer o seguinte:

List list = Collections.synchronizedList(new ArrayList(...));

Abs,

michelantunes

Dê uma olhada no JavaDoc

Dieval_Guizelini

Acho que não existe uma resposta “pronta” para o seu problema.

Vejo a sua questão de três pontos distintos:

  1. Você sabe que esta reinventando a roda, e sabe que isso não é bom, mas não tem certeza se ela realmente é necessária.
  2. A particularidade que você deseja e que se difere da API padrão, você não consegue implementar com especialização.
  3. Você sabe o que está fazendo e com a reinvenção da roda, você ganha em desempenho, uso de memória, processamento…

Para dar um exemplo da 3ª situação, nos fontes do H2 Database, encontra-se textos assim:

/**

  • The object array is basically the same as ArrayList.
  • It is a bit faster than ArrayList in some versions of Java.
    */
Fonte: org.h2.util.ObjectArray

E isso me fez lembrar de um texto que li no livro “A Prática da Programação” de Brian W. Kernighan e Rob Pike:

De qualquer forma, é melhor que reinventar a roda por desconhecimento dos recursos existentes na API…

Você já leu alguma coisa sobre java.util.concurrent? em especial sobre Locks?

fw

R

Creio que essa concurrent seja algo muito pesado para se usar em um trabalho de faculdade que se eu fizer tudo usando uma thread acabe nem dando diferença.

Mas meu objetivo é aprender…Mas acho que usar tudo isso seria demais para o momento…Mas tenho certeza que seria um ótimo aprendizado mexer com isso.

Acho que vou acabar ficando com minha classe mesmo…Testei ela e me parece que ela funciona.

Criado 9 de setembro de 2008
Ultima resposta 9 de set. de 2008
Respostas 4
Participantes 3