Общее·количество·просмотров·страницы

Java Dev Notes - разработка на Java (а также на JavaScript/Python/Flex и др), факты, события из АйТи

суббота, 25 апреля 2009 г.

Deadlock

Классический пример взаимной блокировки (deadlock), взятый отсюда:

public class Deadlock {
static class Friend {
private final String name;
public Friend(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public synchronized void bow(Friend bower) {
System.out.format("%s: %s has bowed to me!\n",
this.name, bower.getName());
bower.bowBack(this);
}
public synchronized void bowBack(Friend bower) {
System.out.format("%s: %s has bowed back to me!\n",
this.name,bower.getName());
}
}

public static void main(String[] args) {
final Friend alphonse = new Friend("Alphonse");
final Friend gaston = new Friend("Gaston");
new Thread(new Runnable() {
public void run() {
alphonse.bow(gaston);
}
}).start();
new Thread(new Runnable() {
public void run() {
gaston.bow(alphonse);
}
}).start();
}
}


Deadlock случается, когда два или более потоков заблокированы, ожидая друг друга. В данном случае deadlock может произойти с высокой вероятностью. Если он произойдет, то будет напечатано:
Alphonse: Gaston has bowed to me!
Gaston: Alphonse has bowed to me!

после чего произойдет взаимная блокировка,так как каждый поток будет ожидать выполнения метода bowBack().

четверг, 23 апреля 2009 г.

Какой конструктор будет вызван?

По мотивам Java Puzzlers #46

Дан следующий код:

public class MyClass 
{
public MyClass(Object o)
{
System.out.println("Object");
}
 
public MyClass(double[] a)
{
System.out.println("double array");
}
 
public static void main(String[] args)
{
new MyClass(null);
}
}


Вопрос: какой констуктор будет вызван в методе main?

На первый взгляд, подходят оба конструктора, так как значение null годится как для Object, так и для double[]. Один из возможных вариантов ответа: произойдет ошибка компиляции. Но это не так. Будет вызван конструктор
public MyClass(double[] a)

Почему?

В Java Language Specification (JLS) есть раздел, освещающий выбор перегруженного метода. Вызывается наиболее специфичный метод. Каждый массив в Java является Object, но не каждый Object является массивом. Конструктор MyClass(Object) принимает любой параметр, переданный конструктору MyClass(double[]). Поэтому наиболее специфичным методом (конструктором) является MyClass(double[]).
Для того, чтобы вызвать конструктор MyClass(Object) при передачи нулевой ссылки (null), следует явно привести null к типу Object:
new MyClass((Object)null);

Конечно, вместо конструкторов можно использовать паттерн фабричный метод, создав публичные статические методы, а все конструкторы объявить private.

Начало

Всем привет,
сегодня, 23 Апреля 2009 года я начал вести этот блог.
Блог посвящен программированию на Java, и другим смежным темам.

Постоянные читатели