Java Slayer: Thread Slayer I

Paweł Szulc kiedyś prowadził cykl Java Killers. Później zmienił się adres bloga i jego język, a idea killersów przeszła na plan dalszy. Dlatego też postanowiłem w ramach przygotowań do SCJP Wrzucać na bloga ciekawe (czyt. patologiczne) przypadki kodu. tytul cyklu zawdzięczamy Williamowi Kingowi i jego opowiadaniom o Gotreku i Felixie.

Zaczynamy od pewnego ciekawego zadania związanego z wątkami i synchronizacją.

Mamy dwa programy.

Listing 1. Program 1

package pl.koziolekweb.slayer;

public class ThreadSlayerIa {
	public static void main(String[] args) {
		MyThread t1 = new MyThread("1", new Integer(1));
		MyThread t2 = new MyThread("2", new Integer(1));

		t1.start();
		t2.start();
	}
}

class MyThread extends Thread {

	private Integer i;

	public MyThread(String name, Integer i) {
		super(name);
		this.i = i;
	}

	@Override
	public void run() {
		synchronized (i) {
			while (true) {
				System.out.println(i + " " + getName());
			}
		}
	}
}

Listing 1. Program 2

package pl.koziolekweb.slayer;

public class ThreadSlayerIb {
	public static void main(String[] args) {
		MyThread t1 = new MyThread("1", new Integer(1000));
		MyThread t2 = new MyThread("2", new Integer(1000));

		t1.start();
		t2.start();
	}
}

class MyThread extends Thread {

	private Integer i;

	public MyThread(String name, Integer i) {
		super(name);
		this.i = i;
	}

	@Override
	public void run() {
		synchronized (i) {
			while (true) {
				System.out.println(i + " " + getName());
			}
		}
	}
}

Pytania:

  • Dlaczego programy wykonują się inaczej?
  • Skąd ta różnica?
  • Co należy zrobić by ujednolicić wykonanie programów?

Odpowiedzi proszę umieszczać w komentarzach. Rozwiązanie za kilka dni.

//Edit: Poprawiłem nazwę klasy w drugim programie.

4 myśli na temat “Java Slayer: Thread Slayer I

  1. Nie bedzie roznicy w wykonaniu.
    Domyslam sie ze nie tyle chodzilo Ci w tym zadaniu o watki i synchronizacje co o stala pule Integer’ow (-128..127) ktora jest uzywana przy autobox’ingu. Twoj kod by faktycznie pokazal roznice gdybys tworzyl watki tak:
    MyThread t1 = new MyThread(„1”, 1);

    (wtedy (int)1 bylby zautoboxowany do obiektu Integer i za kazdym razem bylby to ten sam obiekt)

    ale poniewaz ty jawnie wolasz konstruktor klasy Integer o tak:
    MyThread t1 = new MyThread(„1”, new Integer(1));
    to za kazdym razem jest tworzony nowy obiekt, wiec watki synchronizuja sie niezaleznie na innych obiektach. W obu przypadkach wiec nie bedzie zadnej synchronizacji pomiedzy watkami.

    A tak przy okazji przy takich zadaniach lepiej byloby gdybys podawal od razu diffa zamiast zmuszac czytelnika do szukania linijka po linijce roznic w plikach.

Napisz odpowiedź

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax