Rozwiązanie problemu pijących filozofów w środowisku rozproszonym JavaSpaces

JavaSpaces
Oprócz implementacji naszego algorytmu w środowisku PVM, postanowiliśmy spróbować naszych sił w implementacji tego samego algorytmu w języku Java, a konkretniej w środowisu JavaSpaces. Ponieważ sposób budowania aplikacji w tym środowisku różni się od modelu prezentowanego przez środowisko PVM, omówimy w skrócie główne cechy JavaSpaces (na podstawie książki "JavaSpaces Principles, Patterns, and Practice"; E. Freeman, S. Hupfer, K. Arnold; 1999 rok).
Z punktu widzenia aplikacja obszary (spaces) można traktować jako rozproszoną pamięć współdzieloną. Aplikacje mogą wykonywać trzy proste operacje na takich obszarach:
write – umieścić obiekt w obszarze
take – pobrać obiekt o określonych własnościach (staje się on wówczas niedostępny dla innych aplikacji)
read – odczytać obiekt o określonych własnościach (pozostaje on dalej dostępny do odczytu lub pobrania dla innych aplikacji)
Powyższe operacje są wykonywane atomowo, w tym sensie że np. gdy pewna aplikacja wykona operację take na jakimś obiekcie, to środowisko JavaSpaces gwarantuje, że inna aplikacja tego obiektu już nie pobierze.
Aplikacja gdy chce pobrać/odczytać obiekt z obszaru musi zdefinować wzorzec (template) oczekiwanego obiektu; z takim wzorcem środowisko JavaSpaces porównuje wszystkie obiekty jakie posiada i zwraca jeden z nich pasujący do wzorca (kolejność zwracania obiektów nie jest w żaden sposób zagwarantowana, w szczególności kolejno następójące po sobie operacje read dotyczące tego samego wzorca mogą zwrócić ten sam obiekt). Obiekt jest dopasowany do wzorca gdy: jest tego samego typu co wzorzec (lub jest typu dziedziczącego po typie wzorca); i wszystkie publiczne (public) pola wzorca o wartości różnej od null mają taką samą wartość w obiekcie i we wzorcu (wartość null w polu wzorca jest traktowana jako komunikat: “dopasuj zawsze”).
Ponieważ w środowisku JavaSpaces nie ma dostępnego mechanizmu “rozgłaszania” obiektów, musieliśmy go zaimplementować samodzielnie – aby uzyskać możliwość rozróżniania poszczególnych filozofów od siebie, umieściliśmy w przestrzeni jeden współdzielony obiekt typu PhilosophersCounterEntry, który odpowiada za nadawanie unikalnych identyfikatorów filozofom.
Mając powyższe warunki na względzie zaprojektowaliśmy hierarchię obiektów, którą obrazuje przedstawiony poniżej diagram klas.

<--diagram-->

Related Articles