Имеет ли значение фактическая блокировка при принятии решения об использовании volatile?

Скажем, у меня есть следующий код:

private Integer number;
private final Object numberLock = new Object();

public int get(){
    synchronized(number or numberLock){
        return Integer.valueOf(number);
     }
}

Мой вопрос в том, нужно ли в следующих версиях метода add иметь number как volatile в следующих случаях:

public void add(int num){
    synchronized(number)
        number = number + num;
}

public void add(int num){
    synchronized(numberLock)
        number = number + num;
}

Я понимаю, что это обе атомарные операции, но мой вопрос в том, может ли значение number guarennteed быть вытолкнуто в глобальную память и видно всем потокам без использования volatile?

7
задан Shawn 6 February 2012 в 18:08
поделиться