2015-06-01 4 views
44

Próbuję wykombinować, że moja synchronizacja ("nazwa_grupy") zostanie pominięta, jeśli spróbuję zsynchronizować różne wartości przez nią, dlaczego tak jest.Synchronizacja ("Cache_Group") część zostaje pominięta, dlaczego tak jest?

Rozważmy następujący problem.

Mam grupę SyncGo nazwie "Grupa1", w której mam MBO o nazwie "MBOGroup1", w której mam atrybuty "nazwa", "hasło", "kodCheck". mogę pobrać dane i wyodrębnić na atrybutu jako „releaseCode”

Teraz mam inny SyncGroup nazwie - „GroupSub1”, w którym mam MBO nazwie „MBOSubGroup1”, w których mijam atrybutów „releaseCode” mogę dostać jakieś rezultaty.

Warunkiem jest następujący

Gdybym dostać wiele wierszy dla „MBOGroup1”, kładę dla pętli dla „GroupSub1” i przekazać każde dane „releaseCode” na „GroupSub1” i wynik ekstrakt

Najczęściej zdarza się, że niektóre releaseCode zostanie pominięty i otrzymuję niepoprawny "wynik" dla "GroupSub1", dlaczego tak jest? Jest to spowodowane tym, że pętla for wykonuje szybciej niż słowo synchronize() lub coś innego, jak zasady CacheGroup jako system OnDemand i czas 10 sekund

Prosimy o pomoc.

Ponieważ istnieją dane, w których muszę umieścić więcej niż 4 pętle, w których moje przyszłe wyniki SyncGroup zależą od wyników pobranych z poprzedniej.

+5

Czy możesz podać przykładowy kod, który powoduje nieprawidłowe zachowanie? – Kai

+2

Proszę podać więcej informacji lub przykładowy kod do uzyskania rozwiązania. – 7383

+0

Nie wydaje mi się, że to pytanie na Androida. Czy to możliwe, że jest to pytanie serwera MSSQL? –

Odpowiedz

2
sychronized("Cache_Group") 

Pierwszą rzeczą, która przychodzi do głowy jest to, że sychronizacja na strunie jest bezużyteczna.

sychronized blokuje dostęp do bloku na podstawie podanego odniesienia, a nie wartości. Użycie "łańcucha" jest sprzeczne z tym celem, ponieważ łańcuchy są niezmienne, a wywołanie zsynchronizowane ("Cache_Group") dwukrotnie stworzy 2 łańcuchy z 2 różnymi odniesieniami, pozwalając drugiej iteracji na złamanie zamierzonej blokady.

EDIT: @see ReentrantLock kontroli lepiej dostępu

1

jeśli robi coś takiego:

sychronized("Cache_Group") 

wówczas tworząc łańcuch za każdym razem chcesz synchronizować co oznacza Twój synchronizatorem różnych obiektów za każdym razem , co potrzebne jest, aby synchronizować pomiędzy funkcji jednej zmiennej

przykład:

public class test{ 
    final Object lock = new Object; 

    public void apple(){ 
     sychronized(lock){ 
      ... 
     } 
    } 

    public void orange(){ 
     sychronized(lock){ 
      ... 
     } 
    } 
} 

TIP: Powyższy przykład pokazuje blokującymi wewnątrz klasy, jeśli chcesz zablokować między klasami wówczas zamek obiekt powinien być statyczny/powyżej tych klas lub globalnym, ale uważaj z deadlocking siebie!

Powiązane problemy