JavaRush /ื‘ืœื•ื’ Java /Random-HE /ืกื™ืคื•ืจ ืขืœ ืฉื ื™ ืื™ื˜ืจื˜ื•ืจื™ื: ืืกื˜ืจื˜ื’ื™ื•ืช ืฉื™ื ื•ื™ ืชื—ืจื•ืชื™ ื‘ื’'ืื•ื•ื”

ืกื™ืคื•ืจ ืขืœ ืฉื ื™ ืื™ื˜ืจื˜ื•ืจื™ื: ืืกื˜ืจื˜ื’ื™ื•ืช ืฉื™ื ื•ื™ ืชื—ืจื•ืชื™ ื‘ื’'ืื•ื•ื”

ืคื•ืจืกื ื‘ืงื‘ื•ืฆื”
ืžื—ื‘ืจ ื”ืคืชืง ื”ื•ื Grzegorz Mirek, ืžืคืชื— ืชื•ื›ื ื” ืžืงืจืงื•ื‘ (ืคื•ืœื™ืŸ). ื”ื•ื ื”ืชื—ื™ืœ ืœื”ืชืคืชื— ื‘ื’'ืื•ื•ื” ืœืคื ื™ ื›-6 ืฉื ื™ื, ืขื•ื“ ื‘ืื•ื ื™ื‘ืจืกื™ื˜ื”, ื•ืžืื– ื”ื•ื ืžืฉืคืฉืฃ ืœืœื ืœืื•ืช ืืช ื›ื™ืฉื•ืจื™ื• ื‘ืชื—ื•ื ื–ื”. ื”ื•ื ืžืชืขื ื™ื™ืŸ ื‘ืžื™ื•ื—ื“ ื‘ื‘ื™ืฆื•ืขื™ื ื•ื‘ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืฉืœ JVM, ื•ืขืœ ื›ืš ื”ื•ื ื›ื•ืชื‘ ื‘ืขื™ืงืจ ื‘ื‘ืœื•ื’ ืฉืœื• .
ืกื™ืคื•ืจ ืขืœ ืฉื ื™ ืื™ื˜ืจื˜ื•ืจื™ื: ืืกื˜ืจื˜ื’ื™ื•ืช ืฉื™ื ื•ื™ ืชื—ืจื•ืชื™ ื‘ื’'ืื•ื•ื” - 1
ื›ืžื” ืžืฉืืœื•ืช ื”ืจืื™ื•ื ื•ืช ื”ืคื•ืคื•ืœืจื™ื•ืช ื‘ื™ื•ืชืจ ื‘ื’'ืื•ื•ื” ื›ื•ืœืœื•ืช: ืžื” ื”ื”ื‘ื“ืœ ื‘ื™ืŸ ืื™ื˜ืจื˜ื•ืจื™ื ืžื”ื™ืจื™ ื›ื™ืฉืœื•ืŸ ืœื‘ื™ืŸ ืื™ื˜ืจื˜ื•ืจื™ื ื‘ื˜ื•ื—ื™ื? ื”ืชืฉื•ื‘ื” ื”ืคืฉื•ื˜ื” ื‘ื™ื•ืชืจ ืœื›ืš ื”ื™ื: ืื™ื˜ืจื˜ื•ืจ ืžื”ื™ืจ ื›ื™ืฉืœื•ืŸ ื–ื•ืจืง ConcurrentModificationException ืื ื”ืื•ืกืฃ ืžืฉืชื ื” ื‘ืžื”ืœืš ื”ืื™ื˜ืจืฆื™ื”, ืื‘ืœ ืื™ื˜ืจื˜ื•ืจ ื‘ื˜ื•ื— ื‘ื›ืฉืœ ืœื ืขื•ืฉื” ื–ืืช. ืœืžืจื•ืช ืฉื–ื” ื ืฉืžืข ื“ื™ ืžืฉืžืขื•ืชื™, ืขื“ื™ื™ืŸ ืœื ื‘ืจื•ืจ ืœืžื” ืžืชื›ื•ื•ืŸ ื”ืžืจืื™ื™ืŸ ื›ืฉื™ืฉ ื›ืฉืœ? ืžืคืจื˜ื™ ืฉืคืช Java ืื™ื ื ืžื’ื“ื™ืจื™ื ืืช ื”ืžื•ื ื— ื”ื–ื” ื‘ื™ื—ืก ืœืื™ื˜ืจื˜ื•ืจื™ื. ืขื ื–ืืช, ื™ืฉื ืŸ ืืจื‘ืข ืืกื˜ืจื˜ื’ื™ื•ืช ืฉื™ื ื•ื™ ืชื—ืจื•ืชื™.

ืฉื™ื ื•ื™ ืชื—ืจื•ืชื™

ืจืืฉื™ืช, ื”ื‘ื” ื ื’ื“ื™ืจ ืžื”ื• ืฉื™ื ื•ื™ ืชื—ืจื•ืชื™ (ืื• ืžืงื‘ื™ืœ). ื ื ื™ื— ืฉื™ืฉ ืœื ื• ืื•ืกืฃ ื•ื›ืฉื”ืื™ื˜ืจื˜ื•ืจ ืคืขื™ืœ, ืžืชืจื—ืฉื™ื ื›ืžื” ืฉื™ื ื•ื™ื™ื ืฉืœื ืžื’ื™ืขื™ื ืžื”ืื™ื˜ืจื˜ื•ืจ ื”ื–ื”. ื‘ืžืงืจื” ื–ื”, ืื ื• ืžืงื‘ืœื™ื ืฉื™ื ื•ื™ ืชื—ืจื•ืชื™. ื”ืจืฉื• ืœื™ ืœืชืช ืœื›ื ื“ื•ื’ืžื” ืคืฉื•ื˜ื”: ื ื ื™ื— ืฉื™ืฉ ืœื ื• ื›ืžื” ืฉืจืฉื•ืจื™ื. ื”ื—ื•ื˜ ื”ืจืืฉื•ืŸ ื—ื•ื–ืจ, ื•ื”ื—ื•ื˜ ื”ืฉื ื™ ืžื•ืกื™ืฃ ืื• ืžืกื™ืจ ืืœืžื ื˜ื™ื ืžืื•ืชื• ืื•ืกืฃ. ืขื ื–ืืช, ืื ื• ื™ื›ื•ืœื™ื ืœืงื‘ืœ ConcurrentModificationException ื›ืืฉืจ ืื ื• ืคื•ืขืœื™ื ื‘ืกื‘ื™ื‘ื” ืขื ื—ื•ื˜ ื™ื—ื™ื“:
List<String> cities = new ArrayList<>();
cities.add(โ€œWarsawโ€);
cities.add(โ€œPragueโ€);
cities.add(โ€œBudapestโ€);

Iterator<String> cityIterator = cities.iterator();
cityIterator.next();
cities.remove(1);
cityIterator.next(); // ะณะตะฝะตั€ะธั€ัƒะตั‚ ConcurrentModificationException

ื›ืฉืœ ืžื”ื™ืจ

ืงื˜ืข ื”ืงื•ื“ ืœืขื™ืœ ื”ื•ื ื“ื•ื’ืžื” ืœืื™ื˜ืจื˜ื•ืจ ืžื”ื™ืจ ื›ื™ืฉืœื•ืŸ . ื›ืคื™ ืฉืืชื” ื™ื›ื•ืœ ืœืจืื•ืช, ConcurrentModificationException ื ื–ืจืง ื‘ืขืช ื ื™ืกื™ื•ืŸ ืœืื—ื–ืจ ืืช ื”ืืœืžื ื˜ ื”ืฉื ื™ ืžื”ืื™ื˜ืจื˜ื•ืจ . ืื™ืš ืื™ื˜ืจื˜ื•ืจ ื™ื•ื“ืข ืฉื”ืื•ืกืฃ ื”ืฉืชื ื” ืžืื– ืฉื ื•ืฆืจ? ืœื“ื•ื’ืžื”, ืœืื•ืกืฃ ืขืฉื•ื™ ืœื”ื™ื•ืช ื—ื•ืชืžืช ืชืืจื™ืš/ืฉืขื”, ืœืžืฉืœ lastModified . ื‘ืขืช ื™ืฆื™ืจืช ืื™ื˜ืจื˜ื•ืจ, ืขืœื™ืš ืœื”ืขืชื™ืง ืฉื“ื” ื–ื” ื•ืœืื—ืกืŸ ืื•ืชื• ื‘ืื•ื‘ื™ื™ืงื˜ ืื™ื˜ืจื˜ื•ืจ. ืœืื—ืจ ืžื›ืŸ, ื‘ื›ืœ ืคืขื ืฉื ืงืจื ืœืžืชื•ื“ื” next() , ืคืฉื•ื˜ ืชืฉื•ื•ื” ืืช ื”ืขืจืš lastModified ืžื”ืื•ืกืฃ ืขื ื”ืขื•ืชืง ืžื”ืื™ื˜ืจื˜ื•ืจ. ื’ื™ืฉื” ื“ื•ืžื” ืžืื•ื“ ืžืฉืžืฉืช, ืœืžืฉืœ, ื‘ื™ื™ืฉื•ื ื”ืžื—ืœืงื” ArrayList . ื™ืฉ ืœื• ืžืฉืชื ื” ืžื•ืคืข modCount ื”ืžืื—ืกืŸ ืืช ืžืกืคืจ ื”ืคืขืžื™ื ืฉื”ืจืฉื™ืžื” ืฉื•ื ืชื”:
final void checkForComodification() {
   if (modCount != expectedModCount)
       throw new ConcurrentModificationException();
}
ื—ืฉื•ื‘ ืœืฆื™ื™ืŸ ืฉื”ืื™ื˜ืจื˜ื•ืจื™ื ื”ืžื”ื™ืจื™ื ื›ื™ืฉืœื•ืŸ ืคื•ืขืœื™ื ืขืœ ื‘ืกื™ืก ื”ื˜ื•ื‘ ื‘ื™ื•ืชืจ ืžื”ื–ืŸ, ื›ืœื•ืžืจ ืื™ืŸ ืขืจื•ื‘ื” ืœื›ืš ืฉ- ConcurrentModificationException ื™ื™ื•ืฉืง ื‘ืžืงืจื” ืฉืœ ืฉื™ื ื•ื™ ื‘ืžืงื‘ื™ืœ. ืื– ืืชื” ืœื ืฆืจื™ืš ืœืกืžื•ืš ืขืœื™ื”ื - ืืœื ื™ืฉ ืœื”ืฉืชืžืฉ ื‘ื”ื ื›ื“ื™ ืœื–ื”ื•ืช ืฉื’ื™ืื•ืช. ืจื•ื‘ ื”ืื•ืกืคื™ื ืฉืื™ื ื ื‘ืžืงื‘ื™ืœ ืžืกืคืงื™ื ืื™ื˜ืจื˜ื•ืจื™ื ืžื”ื™ืจื™ ื›ืฉืœ .

ืขืงื‘ื™ื•ืช ื—ืœืฉื”

ืจื•ื‘ ื”ืื•ืกืคื™ื ื”ืžืงื‘ื™ืœื™ื ื‘ื—ื‘ื™ืœืช java.util.concurrent (ื›ื’ื•ืŸ ConcurrentHashMap ื•ืจื•ื‘ Queue ) ืžืกืคืงื™ื ืื™ื˜ืจื˜ื•ืจื™ื ืขืงื‘ื™ื™ื ื—ืœืฉื™ื. ื”ืžืฉืžืขื•ืช ืฉืœ ืžื•ื ื— ื–ื” ืžื•ืกื‘ืจืช ื”ื™ื˜ื‘ ื‘ืชื™ืขื•ื“ :
  • ื ื™ืชืŸ ืœืขื‘ื“ ืื•ืชื ื‘ืžืงื‘ื™ืœ ืœืคืขื•ืœื•ืช ืื—ืจื•ืช
  • ื”ื ืืฃ ืคืขื ืœื ื–ื•ืจืงื™ื ConcurrentModificationException
  • ืžื•ื‘ื˜ื— ืฉื”ื ื™ืขื‘ืจื• ืืœืžื ื˜ื™ื ืงื™ื™ืžื™ื ื‘ื–ืžืŸ ืฉื”ืื™ื˜ืจื˜ื•ืจ ื ื•ืฆืจ ืคืขื ืื—ืช ื‘ื“ื™ื•ืง, ื•ื™ื›ื•ืœื™ื (ืืš ืœื ื ื“ืจืฉื™ื) ืœืฉืงืฃ ืฉื™ื ื•ื™ื™ื ื”ื‘ืื™ื.

ืชืžื•ื ืช ืžืฆื‘

ื‘ืืกื˜ืจื˜ื’ื™ื” ื–ื•, ื”ืื™ื˜ืจื˜ื•ืจ ืžืฉื•ื™ืš ืœืžืฆื‘ ื”ืื•ืกืฃ ื‘ื–ืžืŸ ื™ืฆื™ืจืชื• - ื–ื•ื”ื™ ืชืžื•ื ืช ืžืฆื‘ ืฉืœ ื”ืื•ืกืฃ. ื›ืœ ืฉื™ื ื•ื™ ืฉื ืขืฉื” ื‘ืื•ืกืฃ ื”ืžืงื•ืจื™ ืžื‘ื™ื ืœื™ืฆื™ืจืช ื’ืจืกื” ื—ื“ืฉื” ืฉืœ ืžื‘ื ื” ื”ื ืชื•ื ื™ื ื”ื‘ืกื™ืกื™. ื–ื” ืžืฉืื™ืจ ืืช ืชืžื•ื ืช ื”ืžืฆื‘ ืฉืœื ื• ืœืœื ืฉื™ื ื•ื™, ื›ืš ืฉื”ื™ื ืœื ืžืฉืงืคืช ืฉื™ื ื•ื™ื™ื ื‘ืื•ืกืฃ ืฉื”ืชืจื—ืฉื• ืœืื—ืจ ื™ืฆื™ืจืช ื”ืื™ื˜ืจื˜ื•ืจ. ื–ื•ื”ื™ ื”ื˜ื›ื ื™ืงื” ื”ื™ืฉื ื” ื•ื”ื˜ื•ื‘ื” ืฉืœ ื”ืขืชืง-ืขืœ-ื›ืชื™ื‘ื” (COW) . ื–ื” ืคื•ืชืจ ืœื—ืœื•ื˜ื™ืŸ ืืช ื”ื‘ืขื™ื” ืฉืœ ืฉื™ื ื•ื™ื™ื ื‘ื•-ื–ืžื ื™ื™ื, ื•ืœื›ืŸ ConcurrentModificationException ืœื ื ื•ืฆืจ ื‘ื’ื™ืฉื” ื–ื•. ื‘ื ื•ืกืฃ, ืื™ื˜ืจื˜ื•ืจื™ื ืื™ื ื ืชื•ืžื›ื™ื ื‘ืคืขื•ืœื•ืช ืฉืžืฉื ื•ืช ืืœืžื ื˜ื™ื. ืื•ืกืคื™ ื”ืขืชืง-ืขืœ-ื›ืชื™ื‘ื” ื ื•ื˜ื™ื ืœื”ื™ื•ืช ื™ืงืจื™ื ืžื“ื™ ืœืฉื™ืžื•ืฉ, ืืš ื”ื’ื™ื•ื ื™ ืœื”ืฉืชืžืฉ ื‘ื”ื ืื ืฉื™ื ื•ื™ื™ื ืžืชืจื—ืฉื™ื ื‘ืชื“ื™ืจื•ืช ื ืžื•ื›ื” ื‘ื”ืจื‘ื” ืžืžืขื‘ืจื™ื ืื™ื˜ืจื˜ื•ืจื™ื. ื“ื•ื’ืžืื•ืช ื”ืŸ ื”ืžื—ืœืงื•ืช CopyOnWriteArrayList ื•- CopyOnWriteArraySet .

ื”ืชื ื”ื’ื•ืช ืœื ืžื•ื’ื“ืจืช

ืืชื” ืขืœื•ืœ ืœื”ื™ืชืงืœ ื‘ื”ืชื ื”ื’ื•ืช ืœื ืžื•ื’ื“ืจืช ื‘ืกื•ื’ื™ ืื•ืกืคื™ื ืžื“ื•ืจ ืงื•ื“ื ื›ืžื• Vector ื•- Hashtable . ืœืฉื ื™ื”ื ื™ืฉ ืื™ื˜ืจื˜ื•ืจื™ื ืกื˜ื ื“ืจื˜ื™ื™ื ืžื”ื™ืจื™ ื›ืฉืœ , ืืš ื‘ื ื•ืกืฃ, ื”ื ืžืืคืฉืจื™ื ืฉื™ืžื•ืฉ ื‘ื™ื™ืฉื•ืžื™ื ืฉืœ ืžืžืฉืง ื”-Enumeration , ื•ื”ื ืื™ื ื ื™ื•ื“ืขื™ื ื›ื™ืฆื“ ืœื”ืชื ื”ื’ ื‘ืžืงืจื” ืฉืœ ืฉื™ื ื•ื™ ื‘ืžืงื‘ื™ืœ. ืืชื” ืขืœื•ืœ ืœื”ื™ืชืงืœ ื‘ืืœืžื ื˜ื™ื ืžืกื•ื™ืžื™ื ืฉื—ื•ื–ืจื™ื ืขืœ ืขืฆืžื ืื• ื—ืกืจื™ื, ืื• ืืคื™ืœื• ื›ืžื” ื—ืจื™ื’ื™ื ืžื•ื–ืจื™ื. ืขื“ื™ืฃ ืœื ืœืฉื—ืง ืื™ืชื!
ื”ืขืจื•ืช
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION