"హలో, అమిగో! నిన్న మేము మల్టీథ్రెడింగ్ యొక్క ప్రయోజనాలు మరియు సౌకర్యాల గురించి చర్చించాము. ఇప్పుడు ప్రతికూలతలను చూడవలసిన సమయం వచ్చింది. మరియు, దురదృష్టవశాత్తు, అవి చిన్నవి కావు."

ఇంతకుముందు, మేము ప్రోగ్రామ్‌ను ఒకదానికొకటి పద్ధతులను పిలిచే వస్తువుల సమితిగా చూసాము. ఇప్పుడు ప్రతిదీ కొంచెం క్లిష్టంగా మారుతుంది. ప్రోగ్రామ్ అనేది అనేక "చిన్న రోబోట్‌లు" (థ్రెడ్‌లు) దాని ద్వారా క్రాల్ చేసే మరియు పద్ధతులలో ఉన్న ఆదేశాలను అమలు చేసే వస్తువుల సమితి లాంటిది.

ఈ కొత్త వివరణ మొదటిదాన్ని రద్దు చేయదు. అవి ఇప్పటికీ వస్తువులు, మరియు వారు ఇప్పటికీ ఒకరి పద్ధతులు అని పిలుస్తారు. కానీ అనేక థ్రెడ్‌లు ఉన్నాయని మనం గుర్తుంచుకోవాలి మరియు ప్రతి థ్రెడ్ దాని స్వంత పని లేదా పనిని చేస్తుంది.

కార్యక్రమం మరింత క్లిష్టంగా మారుతోంది. వేర్వేరు థ్రెడ్‌లు వేర్వేరు వస్తువుల స్థితిని అవి చేసే పనుల ఆధారంగా మారుస్తాయి. మరియు వారు ఒకరి కాలిపై మరొకరు అడుగు పెట్టవచ్చు.

కానీ చెత్త విషయం జావా మెషీన్ లోపల లోతుగా జరుగుతుంది. నేను ఇప్పటికే చెప్పినట్లుగా, ప్రాసెసర్ నిరంతరం ఒక థ్రెడ్ నుండి మరొకదానికి మారడం ద్వారా థ్రెడ్‌ల యొక్క స్పష్టమైన ఏకకాలత్వం సాధించబడుతుంది. ఇది ఒక థ్రెడ్‌కి మారుతుంది, 10 మిల్లీసెకన్ల వరకు పని చేస్తుంది, తదుపరి థ్రెడ్‌కు మారుతుంది, 10 మిల్లీసెకన్ల వరకు పని చేస్తుంది మరియు మొదలైనవి. మరియు ఇక్కడ సమస్య ఉంది: ఈ స్విచ్‌లు చాలా అప్రధానమైన సందర్భాలలో సంభవించవచ్చు. ఈ ఉదాహరణను పరిగణించండి:

మొదటి థ్రెడ్ యొక్క కోడ్ రెండవ థ్రెడ్ యొక్క కోడ్
System.out.print ("Nick is");
System.out.print ("");
System.out.print ("15");
System.out.print ("");
System.out.print ("years old");
System.out.println ();
System.out.print ("Lena is");
System.out.print ("");
System.out.print ("21");
System.out.print ("");
System.out.print ("years old");
System.out.println ();
ప్రదర్శించబడాలని మేము ఆశించినవి
నిక్‌కి 15 ఏళ్లు,
లీనా వయసు 21 ఏళ్లు
అసలైన కోడ్ అమలు మొదటి థ్రెడ్ యొక్క కోడ్ రెండవ థ్రెడ్ యొక్క కోడ్
System.out.print ("Nick is");
System.out.print ("Lena is");
System.out.print (" ");
System.out.print (" ");
System.out.print ("15");
System.out.print ("21");
System.out.print (" ");
System.out.print (" ");
System.out.print ("years old");
System.out.println ();
System.out.print ("years old");
System.out.println ();
System.out.print ("Nick is");
//other thread is running
//other thread is running
System.out.print (" ");
System.out.print ("15");
//other thread is running
//other thread is running
System.out.print (" ");
System.out.print ("years old");
System.out.println ();
//other thread is running
//other thread is running
//other thread is running
System.out.print ("Lena is");
System.out.print (" ");
//other thread is running
//other thread is running
System.out.print ("21");
System.out.print (" ");
//other thread is running
//other thread is running
//other thread is running
System.out.print ("years old");
System.out.println ();
వాస్తవానికి ఏమి ప్రదర్శించబడుతుంది
నిక్  లీనా   వయస్సు 15  21  సంవత్సరాలు

మరియు ఇక్కడ మరొక ఉదాహరణ:

కోడ్ వివరణ
class MyClass
{
private String name1 = "Ally";
private String name2 = "Lena";
public void swap()
{
String s = name1;
name1 = name2;
name2 = s;
}
}
స్వాప్ పద్ధతి మరియు వేరియబుల్స్ swapయొక్క విలువలు .name1name2

ఒకే సమయంలో రెండు థ్రెడ్‌ల నుండి పిలిస్తే ఏమి జరుగుతుంది?

అసలైన కోడ్ అమలు మొదటి థ్రెడ్ యొక్క కోడ్ రెండవ థ్రెడ్ యొక్క కోడ్
String s1 = name1; //Ally
name1 = name2; //Lena
String s2 = name1; //Lena(!)
name1 = name2; //Lena
name2 = s1; //Ally
name2 = s2; //Lena
String s1 = name1;
name1 = name2;
//other thread is running
//other thread is running
name2 = s1;
//other thread is running
//other thread is running
//other thread is running
String s2 = name1;
name1 = name2;
//other thread is running
name2 = s2;
బాటమ్ లైన్
రెండు వేరియబుల్స్ "లీనా" విలువను కలిగి ఉంటాయి.
"మిత్రుడు" వస్తువు దానిని తయారు చేయలేదు. అది పోయింది.

"ఇంత సాధారణ అసైన్‌మెంట్ ఆపరేషన్‌తో ఇలాంటి లోపాలు సాధ్యమవుతాయని ఎవరు ఊహించారు?!"

"అవును, ఈ సమస్యకు పరిష్కారం ఉంది. అయితే దీని గురించి కొంచెం తర్వాత మాట్లాడుకుందాం - నా గొంతు ఎండిపోయింది."