Vector problrm

0

Witam
Mam problem stworzyłem metodę która jest wywoływana przez jakiś wątek co 20 sekund.Działa ona w następujący sposób:Metoda wywoływana jest przez wątki z parametrem nr przeszukuje zmienne globalne typy: Vector[nr][], String[nr][]. Jeżeli znajdzie w zmiennej String[nr-1][] oraz String[nr+1][]nazwę którą zawiera String[nr][] to kopiuje pod String[nr-1][i] i String[nr-1][j] zapisane wartości i odpowiadające im Vectory, czyli pod zmienne Vector[nr-1][] i Vector[nr+1][] zapisana jest wartość Vector[nr][].clone +()Jakis_vector.
Problem jest tego typu iż po wyświetleniu zmienne Vector[nr][], raz wszystkie zmienne zawierają raz Vector[nr -1][] a raz Vector[nr +1][] w zależności który wątek wcześniej wywoła metodę - zmienne nie odnalezione przez siąsiada też są zapisywane identycznym wektorem.
Mam nadzieje że w miarę jasno opisałem problem. Bardzo proszę o pomoc

0

Pierwszy błąd to zmienne globalne. To nie pascal ani php. Java bardzo nie lubi zmiennych globalnych. Jak już musisz mieć jedną instancję czegoś to zrób to jako singleton lub jeszcze lepiej odpowiednią fabrykę (wzorce: Singleton, Abstract factory).
Drzuga rzecz jak jest zrobiona synchronizacja w programie, bo mi to wygląda na elegancki konflikt przy współdzieleniu danych.

0
Koziołek napisał(a)

Drzuga rzecz jak jest zrobiona synchronizacja w programie, bo mi to wygląda na elegancki konflikt przy współdzieleniu danych.

Synchronizacji nie robiłem bo wątki muszą działać niezależnie(więc nie wiem czy musi być stosowana synchronizacja) wątek rozpoczyna działanie po kliknięciu na panel.

Koziołek napisał(a)

Pierwszy błąd to zmienne globalne. To nie pascal ani php. Java bardzo nie lubi zmiennych globalnych. Jak już musisz mieć jedną instancję czegoś to zrób to jako singleton lub jeszcze lepiej odpowiednią fabrykę (wzorce: Singleton, Abstract factory).

Nie zam się za dobrze na Javie jak i programowaniu. Czy mogą zostać te zmienne globalne choć java ich nie lubi. bo nie wiem jak korzystać z fabryk i singeltona(jakiś przykład jeśli mogę prosić).
A jest jakiś inny sposób mniej estetyczny ale działający

0

Synchronizacja nie powoduje, ze wątki zaczynają być zależne od siebie. Jej zadaniem jest atomizacja pewnych fragmentów kodu tak by na raz miał dostęp tylko jeden wątek.

W twoim przypadku masz sytuację, w której wykonujesz klika operacji zależnych od siebie. Jednocześnie dobrze by było jeżeli wszystkie te operacje były by wykonane "na raz". Odczyt z n-1, odczyt z n+1 i następnie kilka zapisów. Każda z tych operacji może zostać przerwana przez inny watek i może zostać zmodyfikowany stan obiektu tak, że pierwsze podejście będzie już nieaktualne lub będzie powodowalo wprowadzenie niespójności. Przykład;

String s = strings[n-1];

mamy tu cztery operacje:

  • odczyt n
  • zmniejszenie n o 1 "w locie"
  • odczyt strings[n-1]
  • zapis do s
    Pomiędzy każde dwie operacje może zostać wpakowany osobny wątek i przy odrobinie pecha może to wyglądać tak:
    w1:
  • odczyt n
  • zmniejszenie n o 1 "w locie"
    w2:
  • odczyt n
  • zmniejszenie n o 1 "w locie"
  • odczyt strings[n-1]
  • ustawienie strings[n-1] na null
    w1:
  • odczyt strings[n-1]
  • przypisanie s null

wszystko jest niby cacy. Oba wątki dostały mniej więcej tyle samo procesora (4 jednostki), ale w1 zamiast dostać obiekt dostał null i się wywalił.
Jeżeli użyjesz synchronized to operacje odczytu i zapisu będą wykonywane jedna po drugiej i masz gwarancję, że w2 nie wepchnie sie pomiędzy różne kroki w1 i nie namiesza. Wątki nie są zależne i mogą działać niezależnie od siebie, ale są punkty w których będą kolejkowane w celu zabezpieczenia przed rozwaleniem obieku.

Co do singletona:
Singleton
http://koziolekweb.pl/2008/12/10/singleton-inaczej/

0

A można ominąć tego całego singletona:
i zadeklarować zmienne lokalne dla danego wątku do których dostęp będą miały inne wątki i będą mogły je modyfikować.

Albo pozostawić zmienne jako globalne string[n] i odczytać string[n-1] i string[n+1] i zapisać złożone w ten sposób dane string[n](odwrócić rozumowanie z pierwszego postu).

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