Флаги доступа в синхронизированных методах? - PullRequest
2 голосов
/ 22 января 2012

Я просматривал некоторые PDF-файлы из университетского класса и заметил следующую часть кода:

public class MyMemoryElements {
    private String x = "";

    public MyMemoryElements(String message){
        this.x = message;
    }

    @Override
    public boolean equals(Object o){
        if(o instanceof MyMemoryElements ){
            MyMemoryElements tmp = (MyMemoryElements)o;
            if(tmp.toString().equalsIgnoreCase(this.x))
               return true;
            return false;
        }
        return false;

    }

    @Override
    public String toString(){
        return this.x;
   }
}

и основной код:

public class MainMemory {
   private Vector<MyMemoryElements> storage;
   private boolean canAccess = true;
   private int counter = -1;

   public MainMemory(){
       storage = new Vector<MyMemoryElements>();
   }

   public synchronized MyMemoryElements take(String s) {
       System.out.print("Method take has been invoked by "+s+". Element is:");
       while (!canAccess || storage.size()==counter+1) {
           try {
               wait();
           } catch (InterruptedException e) {}
       }
       canAccess = false;
       counter++;
       MyMemoryElements x = storage.elementAt(counter);
       try {
           Thread.sleep(10000);
       } catch (InterruptedException ex) {}
       notifyAll();
       System.out.println(x.toString());
       canAccess = true;
       return x;
   }

   public synchronized void update(MyMemoryElements element) {
       System.out.println("Producer is inserting element "+ element.toString());
       while (!canAccess) {
           try { 
               wait();
           } catch (InterruptedException e) {}
       }
       canAccess = false; 
       this.storage.add(element);
       notifyAll();
       canAccess = true;
   }
}

Кажется, я не понимаю, как это нужнодля переменной canAccess с учетом синхронизации методов (а также причины, по которой флаг изменяется после notifyAll и не раньше)

РЕДАКТИРОВАНИЕ : дополнительный вопрос:Есть ли смысл во всем этом коде?Я имею в виду все, что он делает, это получает и добавляет что-то к вектору.Разве эти действия не синхронизированы уже на векторах?Весь этот код только для того, чтобы мы могли получить несколько отпечатков?

1 Ответ

1 голос
/ 22 января 2012

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

(Похоже, кто-то хотел быть действительно, действительно уверен, что не было проблем с синхронизацией.: -)

По иронии судьбы, можно утверждать, что canAccess не является потокобезопасным. Так что даже без синхронизации методов это не обязательно будет подходящей альтернативой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...