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 Responses to “Java Slayer: Thread Slayer I”

  1. swiety Says:

    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.

  2. Pawel Szulc Says:

    Java Killers nie umarlo. Przechodzi reinkarnacje na nowym blogu :)

  3. Koziolek Says:

    To dobrze…

  4. Keraj Says:

    Dla Integer(1) nie będą tworzone nowe obiekty…

Leave a Reply