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.