2009-12-13 1 views
3

Учитывая этот код:Понимание синхронизируется

public class Messager implements Runnable {    

    public static void main(String[] args) { 
     new Thread(new Messager("Wallace")).start();  
     new Thread(new Messager("Gromit")).start();    
    }    
    private String name;     
    public Messager(String name) { this.name = name; }    
    public void run() {  
     message(1); message(2);  
    }   
    private synchronized void message(int n) {  
    System.out.print(name + "-" + n + " ");  
    }  
} 

Я понимаю, что ключевое слово synchronized делает поток зависит от блокировки объекта. Вопросы:

a) Заблокирован ли замок, как только метод помечен как synchronized? Или как только метод потока run() закончит . Б) Могу ли я гарантировать, что какой-либо из нитей будет печатать свое имя и 1 2 перед другим?

+0

Вы фактически блокируете два разных экземпляра, поэтому 'sycnhronized' не будет ничего делать. (Явно использую блок «synchronized», а не модификатор, делает вещи более ясными. Лучше использовать отдельный объект блокировки.) –

ответ

2

A. Да. Он отпускается, как только заканчивается функция synchronized.
B. Да. Вы можете, но если вы этого захотите, зачем писать многопоточный код? synchronized гарантирует атомарность, а не что-то относительно заказа, но вы можете обеспечить порядок, ожидая изменения флага. Во всяком случае, то, что вы пытаетесь обеспечить, является последовательностью. Вы получаете это бесплатно в однопоточных средах :)

+0

О, я просто задаю вопрос «что, если». Я учусь за scjp. Благодарю. – andandandand

+0

dmindreader, добавьте новый тег scjp в будущие вопросы scjp, спасибо. –

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

  • Нет связанных вопросов^_^