Unicestwienie metody synchronizowanej

0

Witam
Próbuje w jakiś sposób unicestwić metodę i niestety nie wychodzi mi to.
W owej metodzie wartość jest wyznaczana przez przysłanianą metodę call() z interfejsu podobnego do Callable tyle że bez obsługi wyjątków.

NazwaInterf<V> a;

// tu jakiś konstruktor

//owa metoda
public synchronized void setValue() {
if (a != null) {
  value = a.call();
  a = null;
}
}

Kilka wątków może się ubiegać o wywołanie metody setVaule() tyle że chciałbym aby tak call() spowodowała błąd który jakoś zniszczy setValue() by już wątki nie mogły wywołać.
W metodzie call() można by uruchomić jakiś nowy wątek, może jakoś nim można coś zrobić.
Jedyne co wymyśliłem to zwracanie wartości Integer.parseInt(string) gdzie string to np. a.

Oczywiście chciałem się tego dowiedzieć w celach naukowych, szukałem już wiele i nie znalazłem nic o celowym złym działaniu. :)

dodanie znacznika <code class="java"> - fp

0

Na polski - chcesz by pierwsze, bądź obłożone jakimś dodatkowym warunkiem, wywołanie call za pomocą metody setValue spowodowało, że nie kolejne wywołania metody setValue nie będą już wywoływać call, tak?

Wystarczy zatem by zamiast a!=null zrobić:

public synchronized void setValue() {
   if (value == null) 
      value = a.call();
}

BTW, nazwanie metody setValue bez przekazywania jej parametrów jest kiepskim pomysłem. Gmatwa kod. Lepiej już nazwać ją prepareValue lub obtainValue

0

O coś innego mi chodzi, może lepiej to napiszę.
Ta metoda to taki przykład pisany razem z wiadomością, nazwa przykładowa. Dowiedziałem się że wywołanie call() o ile będzie coś w niej nieprzewidzianego może sprawić że "rozwali" synchronized w tym przypadku dla setValue().
Tylko chciałbym zobaczyć to rozwalenie tej metody.

Właściwie zły przykład dałem. najlepiej tak:

public synchronized T getValue() {
    if (a != null) {
        value = a.call();
        a = null;
    }
    return value;
}

Na marginesie:
Wydaje mi się że aby zabezpieczyć przed niespodziankami trzeba by przenieść value = a.call(); do innej metody, a metoda call() z obsługa wyjątków (T call() throws Exception; - czyli najlepiej użyć gotowego interfejsu Callable).
Ale nie mam jak tego wszystkiego sprawdzić jak nie umiem uwalić synchronized dla podanego przykładu. Jedynie to próba zwrócenia innego typu jak wpisałem w 1 poście i dalej już dostaje null a getValue() zwraca zaraz value.

dodanie znacznika <code class="java"> - fp

1

To rozwalenie polegać będzie na tym, ze w przypadku wystąpienia wyjątku zwolnieniu ulega monitor (w tym przypadku monitorem jest this) co może powodować niespójność danych.

0

Nie sądziłem że tylko o to chodzi. Jak słyszałem o nieprzewidzianych zdarzeniach to zrozumiałem coś jak na miarę windowsowych blue screen :P (coś jak wymazanie getValue())

@Koziołek
Dzięki za info :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1