ทรัพยากรที่ใช้ร่วมกัน ความขัดแย้ง การเข้าถึงที่ใช้ร่วมกัน - 1

"สวัสดี Amigo! ฉันอยากจะบอกคุณเกี่ยวกับการแบ่งปันทรัพยากร ข้ามเธรดต่างๆ ตามธรรมชาติ

"ฉันมักจะพูดถึงปัญหาที่เกิดขึ้นเมื่อทำงานกับเธรดหลายเธรดและวิธีแก้ไข นี่ไม่ได้หมายความว่าการใช้เธรดเป็นสิ่งไม่ดี เธรดเป็นเครื่องมือที่ทรงพลังมาก อันที่จริง มันช่วยให้คุณสร้างโปรแกรมของคุณได้เร็วขึ้นและแม้กระทั่ง เชื่อถือได้มากขึ้น ยิ่งโปรแกรมซับซ้อนมากเท่าใด เธรดและส่วนอิสระต่างๆ ก็ยิ่งมีมากขึ้นเท่านั้น"

"การแยกโปรแกรมออกเป็นส่วนอิสระ (คู่หลวมๆ) นั้นมีประโยชน์มาก"

"ลองจินตนาการว่าโปรแกรมของคุณถูกแบ่งออกเป็น 100 เธรด แต่คุณมีโปรเซสเซอร์แบบดูอัลคอร์เท่านั้น ซึ่งหมายความว่าโดยเฉลี่ยแล้ว 50 เธรดจะถูกดำเนินการในแต่ละคอร์"

"หากคุณต้องการเพิ่มประสิทธิภาพของโปรแกรม คุณก็เพียงแค่ซื้อเซิร์ฟเวอร์ที่มีโปรเซสเซอร์คู่และโปรเซสเซอร์ดีๆ สองสามตัวสำหรับโปรแกรมนี้ ซึ่งสามารถเพิ่มแกนประมวลผลได้ถึง 32 คอร์ ทำให้ประสิทธิภาพเพิ่มขึ้น 2-20 เท่า ขึ้นอยู่กับจำนวน ของส่วนที่เป็นอิสระอย่างแท้จริง มันแบ่งออกเป็น"

"นี่คือหนึ่งในเหตุผลที่ทำให้ Java มีอิทธิพลเหนือการพัฒนาองค์กร หากบริษัทมีโปรแกรมภายในที่ซับซ้อนซึ่งเขียนโดยนักพัฒนา 20 คน การซื้อเซิร์ฟเวอร์อื่นจะถูกกว่ามากเมื่อเทียบกับการเพิ่มประสิทธิภาพของโปรแกรมเป็นสองเท่าผ่านการเพิ่มประสิทธิภาพ"

"นั่นคือสิ่งที่เกี่ยวกับทั้งหมด"

"แต่! ทุกครั้งที่นักพัฒนาตัดสินใจใช้เธรดอื่น เขาจะแก้ปัญหาหนึ่งและสร้างสองเธรด เธรดที่มากขึ้นเรื่อย ๆ จะไม่เพิ่มประสิทธิภาพของโปรแกรมอย่างไม่มีที่สิ้นสุด"

"ประการแรก โปรแกรมใด ๆ มีงานที่ไม่สามารถแยกออกจากกันได้และทำงานแบบขนานบนเธรดที่แตกต่างกัน ประการที่สอง เธรดทั้งหมดถูกดำเนินการบนโปรเซสเซอร์เดียวกัน ยิ่งคุณมีเธรดมากเท่าไหร่ แต่ละเธรดก็ยิ่งทำงานช้าลงเท่านั้น"

"และที่สำคัญที่สุด เธรดมักจะใช้วัตถุเดียวกัน (โดยปกติจะเรียกว่า 'ทรัพยากรที่ใช้ร่วมกัน')"

"ตัวอย่างเช่น เธรดต้องการบันทึกข้อมูลเกี่ยวกับงานที่ทำเสร็จแล้วลงในไฟล์ หากมีเธรดดังกล่าวหลายเธรดและต้องการเขียนข้อมูลลงในไฟล์เดียวกัน เธรดเหล่านั้นจะรบกวนซึ่งกันและกัน เพื่อป้องกันไม่ให้ไฟล์กลายเป็น ความยุ่งเหยิงที่สับสน การเข้าถึงไฟล์ถูกจำกัด กล่าวคือ ในขณะที่เธรดหนึ่งใช้ไฟล์ เธรดอื่นๆ จะรอ"

"ใช่ ฉันจำได้ คุณทำอย่างนั้นโดยใช้ คีย์เวิร์ด ที่ซิง โครไนซ์ "

"ถูกต้องครับ"

"แล้วถ้าเธรดกำลังเขียนไปยังไฟล์อื่นล่ะ"

"อย่างเป็นทางการ สิ่งเหล่านี้เป็นวัตถุที่แตกต่างกัน แต่อาจอยู่ในฮาร์ดไดรฟ์เดียวกัน"

"ดังนั้น เป็นไปได้จริงหรือที่จะขนานบางสิ่งภายในโปรเซสเซอร์"

"ในทางเทคนิค ใช่ แต่ทันทีที่เธรดของคุณต้องการบางสิ่งนอกเหนือจากข้อมูลที่มีอยู่ เธรดอื่นอาจครอบครองบางสิ่งไปแล้ว และเธรดของคุณจะต้องรอ"

“ถ้าอย่างนั้นฉันควรทำอย่างไร ฉันจะรู้ได้อย่างไรว่าฉันควรทำเธรดมากหรือไม่”

"สิ่งนี้ถูกกำหนดโดยตรงจากสถาปัตยกรรมของโปรแกรมของคุณ ทุกโครงการมี 'สถาปนิก' ของตัวเองที่รู้จัก 'ทรัพยากร' ทั้งหมดที่ใช้ในโปรแกรม รู้ข้อจำกัด และดี/ไม่ดีที่ขนานกัน"

“แล้วถ้าฉันไม่รู้ล่ะ”

"มีสองทางเลือก:"

ก)ทำงานภายใต้การกำกับดูแลของบุคคลที่ทำ

b)รับก้อนบางอย่างที่คิดออกด้วยตัวคุณเอง

"ฉันเป็นหุ่นยนต์: ฉันไม่ได้เป็นก้อน - มีแต่รอยบุบ"

“งั้นก็หาอะไรรองท้องหน่อยสิ”

“เข้าใจแล้ว ขอบคุณ คุณอธิบายบางสิ่งที่ฉันเริ่มสงสัยแล้ว”