การใช้ซิงโครไนซ์ - 1

“สวัสดี อามีโก้!”

“ใช่ ฉันอยู่นี่ ฉันอยู่นี่”

"วันนี้ฉันจะบอกคุณเกี่ยวกับการใช้ซิงโครไนซ์ในทางปฏิบัติ"

"เมื่อโปรแกรมมีออบเจกต์และเธรดจำนวนมาก บ่อยครั้งเธรดหลายเธรดจะทำงานร่วมกับออบเจกต์เดียวกันพร้อมกัน ซึ่งการทำเช่นนั้น เธรดจะรบกวนซึ่งกันและกัน"

“ใช่ ฉันรู้เรื่องนี้แล้ว”

"สมมติว่าคุณมีออบเจกต์ที่ถูกเข้าถึงโดยหลายเธรด คุณสามารถทำสองสิ่งเพื่อหลีกเลี่ยงปัญหา"

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

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

"ดังนั้นวัตถุใดๆ ที่ฉันอาจใช้จากหลายเธรด และนี่คือวัตถุเกือบทั้งหมดในโปรแกรม ฉันต้องทำให้เธรดปลอดภัยหรือไม่"

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

"ปลอดภัย?"

"Thread-safe ซึ่งหมายความว่าสามารถเรียกได้อย่างปลอดภัยจากหลายๆ เธรด"

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

“อืม นั่นทำให้อะไรๆ ง่ายขึ้น”

"ตอนนี้ สมมติว่าคุณต้องการสตริงที่ไม่แน่นอน"

"ใช่ ฉันจำได้ มีสตริงดังกล่าวอยู่ 2 ชนิด: StringBuffer และ StringBuilder StringBuffer เหมือนกับ StringBuilder แต่เมธอดทั้งหมดจะถูกซิงโครไนซ์ เธรดปลอดภัยด้วยหรือไม่"

"ใช่ ถ้าคุณต้องการเข้าถึงออบเจกต์ StringBuilder จากหลายๆ เธรด คุณต้องแทนที่ด้วย StringBuffer มิฉะนั้น เธรดจะเปลี่ยนไม่ช้าก็เร็วพร้อมๆ กันและ «หยุด» มัน"

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

"ใช่ เป็นการดีที่สุดที่จะปฏิบัติตามกฎนี้: อ็อบเจ็กต์ทั้งหมดที่จะเข้าถึงได้จากเธรดที่แตกต่างกันจะต้องปลอดภัยสำหรับเธรด"

"ฉันเข้าใจแล้ว ฉันไม่คิดว่าทุกอย่างจะร้ายแรงขนาดนี้ ขอบคุณ เอลลี่"

"ยินดีต้อนรับ ฉันหวังว่าเคล็ดลับเหล่านี้จะช่วยคุณได้เมื่อดิเอโกให้งานง่ายๆ สองสามอย่างแก่คุณ ☺"