2015-07-30 4 views
-1

В документации говоритВ настоящее время бегущая нить удерживает замок во время сна?

во время сна на тему не освобождает замки он держит

Однако мой фрагмент кода демонстрирует это релиз замке

public class SynchronizationTest { 

    public static void main(String[] args) { 
     Common c = new Common(); 
     new PersonONE(c); 
     new PersonTWO(c); 
    } 
} 

class Common { 
    private String message = "This is shared message"; 
    public String getMessage() { 
     return message; 
    } 
} 

class PersonONE extends Thread { 
    private Common c; 
    public PersonONE(Common c) { 
     this.c = c; 
     start(); 
    } 
    @Override 
    public void run() { 
     synchronized (c.getClass()) { 
      for (int i = 0; i < 5; i++) { 
       System.out.println("PersonONE: " + c.getMessage()); 
       try { 
        Thread.currentThread().sleep(100); 
       } catch (InterruptedException e) {} 
      } 
     } 
    } 
} 

class PersonTWO extends Thread { 
    private Common c; 
    public PersonTWO(Common c) { 
     this.c = c; 
     start(); 
    } 
    @Override 
    public void run() { 
     for (int i = 0; i < 5; i++) { 
      System.out.println("PersonTWO: "+c.getMessage()); 
      try { 
       Thread.sleep(100); 
      } catch (InterruptedException e){} 
     } 
    } 
} 

Выход
PersonONE: Это общее сообщение
PersonTWO: Это общее сообщение
PersonONE: Это общее сообщение
PersonTWO: Это общее сообщение
PersonONE: Это общее сообщение
PersonTWO: Это общее сообщение
PersonONE : Это сообщение разделяет
PersonTWO: Это сообщение разделяет
PersonONE: Это сообщение разделяет
PersonTWO: Это сообщение разделяет

Итак, вопрос в том, где я ошибаюсь?

+1

Вы не объясните, как вы пришли к заключению, которое вы достигли из представленных вами доказательств. –

+0

Если возможно, попробуйте реализовать Runnable вместо продолжения Thread. Это лучшая практика. – JFPicard

+3

@JFPicard: в опубликованном коде есть нарушение правил. –

ответ

5

PersonTWO не пытается приобрести замок.

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

private static class Locker implements Runnable { 
    private final Object lock; 
    private final String message; 

    private Locker(final Object lock, final String message) { 
     this.lock = lock; 
     this.message = message; 
    } 

    @Override 
    public void run() { 
     try { 
      synchronized (lock) { 
       for (int i = 0; i < 10; i++) { 
        System.out.println(message); 
        Thread.sleep(1000); 
       } 
      } 
     } 
     catch (InterruptedException ex) { 

     } 
    } 
} 

public static void main(String[] args) { 
    final int numThreads = 2; 
    final Object lock = new Object(); 
    for (int i=0;i<numThreads;i++) { 
     new Thread(new Locker(lock, "Hello - " + i)).start(); 
    } 
} 
+1

Иными словами, два потока не приобретают ту же самую блокировку, с которой они могут работать одновременно. +1 –

+0

@brain, если 'Personone' не спит внутри синхронизированного блока' PersonTWO' не может получить доступ к общему объекту, даже если он не пытается получить блокировку. – Anarantt

+0

@Anarantt Так обычно делают люди, но это не то, что делает ваш код. Блокировка не знает, что она блокирует, это ваша задача программиста, чтобы сделать блокировку защитой чего-то полезным способом. –