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.












May 28th, 2009 at 11:17
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.
May 28th, 2009 at 12:09
Java Killers nie umarlo. Przechodzi reinkarnacje na nowym blogu
May 28th, 2009 at 12:45
To dobrze…
May 29th, 2009 at 13:40
Dla Integer(1) nie będą tworzone nowe obiekty…