2012-05-15 2 views
1

В разделе «Тупик» в учебнике по Java SE 7 приведен пример, как показано ниже. Я не понимаю, почему основной метод может создать 2 STATIC вложенных объектов (на самом деле он определяется как статический вложенный класс). Говорят, что нет никакого экземпляра какого-либо статического класса, верно? Может кто-нибудь мне помочь? Благодарю.Могу ли я создать несколько объектов вложенных объектов STATIC?

==================================================================================================================================== =========================================== Альфонс и Гастон друзей и великих верующих в вежливости. Строгое правило вежливости заключается в том, что, когда вы кланяетесь другу, вы должны оставаться поклонившимся, пока ваш друг не сможет вернуть лук. К сожалению, это правило не учитывает возможность того, что двое друзей могут одновременно поклоняться друг другу. Этот пример приложения, Тупик, модели такая возможность:

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(); 
    } 
} 

При запуске Тупик, это весьма вероятно, что оба потока будут блокировать, когда они пытаются вызвать bowBack. Ни один из блоков никогда не закончится, потому что каждый поток ждет другого, чтобы выйти из лука.

ответ

1

Из учебники Java: В сущности, статический вложенный класс поведенческий класс верхнего уровня, который был вложенный в другой класс верхнего уровня для удобства упаковки.

Вы можете удалить Friend изнутри тупика и использовать его как внешний класс без изменений в поведении.

«Статический» относится к доступу к переменным и методам во внешнем классе.Как и статические (класс) методы, статический вложенный класс не может напрямую ссылаться на переменные экземпляра или методы, определенные в его охватывающем классе, - он может использовать их только через ссылку на объект.

Я не думаю, что он говорит где угодно ", что нет никакого экземпляра какого-либо статического класса". Внешний класс не может быть статическим, а вложенный класс является внешним классом.

Хороший вопрос, хотя - я недавно прошел этот пример и не думал об этом.

+0

хорошо информация. Спасибо большое. – icepeanuts

0

EDIT: Несмотря на то, что создание потока происходит гораздо медленнее, чем вызов методов, загрузка их в первый раз занимает еще больше времени.

Как код, это делает тупик, потому что время, необходимое для загрузки методов, эффективно выравнивает два потока, поскольку методы не могут быть вызваны до их загрузки.

Если вы добавили следующую строку между запуском нитей, вы не получите тупик.

Thread.sleep(50); 

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

alphonse.bow(gaston); 

Prevous ответ.

ИМХО, маловероятно, что вы зашли в тупик.

Если вы неоднократно выполняли эти задания, они, в конечном счете, зашли в тупик. Вы выполняете эти операции только раз в разное время. Это связано с тем, что запуск нового потока занимает гораздо больше времени, чем время между двумя полученными блокировками. (Разница 100x или больше.)

Я бы ожидал, что это затормозит, возможно, раз в сто пробегов, но это может быть и реже.

Говорят, что нет никакого экземпляра какого-либо статического класса, верно?

не знает, что это означает, что, поскольку есть два экземпляра Friend Там нет экземпляра Deadlock

+0

Я получаю тупик каждый раз. Внутренняя фиксация в гадоне приобретается нитью [2]. Поэтому, когда альфа-поток из нити [1] пытается захватить гастрономический замок, чтобы поклониться, он не может этого сделать и наоборот. – Sridhar

+0

глубокий ответ! Благодарю. – icepeanuts

+0

@RajChola Хорошо, я исправил свой ответ для этого примера. –

Смежные вопросы