Deadlock e starvation

Olá pessoal,

estou estudando deadlock e starvation em Java e gostaria de ver um exemplo de código em que ocorre essas situações. Infelizmente até agora não encontrei… :frowning:

Alguém por aqui poderia me ajudar?

Starvation:

[code]package testes;

import java.util.Random;
import java.util.Scanner;

public class Starvation
{
public static void main(String[] args)
{
Cesta cesta = new Cesta(20); // buffer

    int qtdProdutores = 5;
    int qtdConsumidores = 5;

    Produtor[] produtores = new Produtor[qtdProdutores];
    Consumidor[] consumidores = new Consumidor[qtdConsumidores];

    for (int i = 0; i < qtdProdutores; i++)
    {
        produtores[i] = new Produtor(cesta);
        produtores[i].start();
    }

    for (int i = 0; i < qtdConsumidores; i++)
    {
        consumidores[i] = new Consumidor(cesta);
        consumidores[i].start();
    }

    Scanner in = new Scanner(System.in);

    while (true)
    {
        String s = in.next();
        
        // Interrompe o programa com S
        if (s.equalsIgnoreCase("S"))
        {
            for (int i = 0; i < qtdProdutores; i++)
                produtores[i].interrupt();

            for (int i = 0; i < qtdConsumidores; i++)
                consumidores[i].interrupt();
            
            break;
        }
    }
}

}

class Cesta
{
private int qtd;
private int máximo;

public Cesta(int máximo)
{
    this.máximo = máximo;
}

synchronized public boolean coloca()
{
    if (qtd == máximo)
        return false;

    qtd++;
    return true;
}

synchronized public boolean retira()
{
    if (qtd == 0)
        return false;

    qtd--;
    return true;
}

}

abstract class ProdCons extends Thread
{
Cesta cesta;
Random rand = new Random();

public ProdCons(Cesta cesta)
{
    this.cesta = cesta;
}

abstract void executa();

@Override
public void run()
{
    boolean continua = true;
    while (continua)
    {
        executa();
        continua = espera(1000);
    }
}

boolean espera(int n)
{
    try
    {
        sleep((int) (rand.nextFloat() * n));
    }
    catch (InterruptedException ex)
    {
        return false;
    }
    return true;
}

}

class Consumidor extends ProdCons
{
public Consumidor(Cesta cesta)
{
super(cesta);
}

@Override
void executa()
{
    if (cesta.retira() == false)
    {
        System.out.println(toString() + ": Estou com fome!");
        // Aumenta o tempo de espera par adar tempo de produzir.
        espera(2000);
    }
}

}

class Produtor extends ProdCons
{
public Produtor(Cesta cesta)
{
super(cesta);
}

@Override
void executa()
{
    if (cesta.coloca() == false)
    {
        System.out.println(toString() + ": Jogando o produto fora!");
        // Aumenta o tempo de espera par adar tempo de consumir.
        espera(2000);
    }
}

}[/code]

Obrigado Bruno Laturner!

É que não tenho muita facilidade com inglês, e tudo q achava no google tava em english… :frowning: