ภาพรวม
เมื่อเร็ว ๆ นี้ฉันกำลังอ่าน "การคิดใน Java" และพื้นฐานมาก
1. เวทมนตร์
ความผันผวนส่วนใหญ่ใช้เพื่อซิงโครไนซ์ตัวแปรในมัลติเธรด
โดยทั่วไปเพื่อปรับปรุงประสิทธิภาพแต่ละเธรดจะบันทึกตัวแปรในหน่วยความจำหลักเป็นสำเนาตัวแปรในหน่วยความจำของตัวเองเมื่อมันกำลังทำงานอยู่ แต่มันง่ายที่จะทำให้ตัวแปรจำลองที่ไม่สอดคล้องกันบันทึกในหลายเธรด ค่าตัวแปรในหน่วยความจำหลัก
เมื่อตัวแปรถูกแก้ไขโดยความผันผวนตัวแปรไม่สามารถแคชลงในหน่วยความจำของเธรดได้ "." สำเนาตัวแปรของพื้นที่หน่วยความจำดังนั้นเมื่อตัวแปรเปลี่ยนแปลงเธรดทั้งหมดที่เรียกว่าตัวแปรจะได้รับค่าเดียวกันซึ่งทำให้มั่นใจได้ว่าการมองเห็นตัวแปรในแอปพลิเคชัน (เมื่องานถูกแก้ไขในแอปพลิเคชันจะต้องเป็นภาพ ) และประสิทธิภาพก็ลดลงเช่นกัน (แม้ว่าจะสูงกว่าการซิงโครไนซ์)
อย่างไรก็ตามควรสังเกตว่าความผันผวนสามารถตรวจสอบให้แน่ใจว่าการดำเนินการเป็นหน่วยความจำชิ้นเดียวกันและไม่สามารถรับประกันความเป็นอะตอมของการดำเนินการได้ ดังนั้นโดยทั่วไปความผันผวนจะใช้ในการประกาศตัวแปรประเภทง่าย ๆ เพื่อให้ตัวแปรเหล่านี้เป็นอะตอมนั่นคือการมอบหมายและการส่งคืนแบบง่าย ๆ จะทำให้มั่นใจได้ว่าพวกเขาจะไม่ถูกขัดจังหวะ อย่างไรก็ตามเมื่อค่าของตัวแปรถูกกำหนดโดยหนึ่งของตัวเองบทบาทของความผันผวนจะไม่ถูกต้องซึ่งถูกกำหนดโดยลักษณะของคำหลักที่ผันผวน
ดังนั้นระวังเมื่อผันผวน
2. ThreadLocal
ก่อนอื่น Threadlocal ไม่มีความสัมพันธ์เล็กน้อยกับเธรดท้องถิ่นและไม่ใช่เธรดพิเศษ ใช้ตัวแปรดังนั้นแต่ละเธรดสามารถเปลี่ยนสำเนาของตัวเองได้อย่างอิสระโดยไม่ส่งผลกระทบต่อสำเนาที่เกี่ยวข้องกับเธรดอื่น ๆ นี่เป็นวิธีการแลกเปลี่ยนพื้นที่สำหรับเวลา (ตรงข้ามกับการซิงโครไนซ์) ซึ่งลดการใช้ประสิทธิภาพที่เกิดจากการซิงโครไนซ์เธรด (เช่นซิงโครไนซ์) อย่างมากและลดความซับซ้อนของการควบคุมเธรดพร้อมกันที่ค่าใช้จ่ายของหน่วยความจำ
โดยส่วนตัวแล้วฉันคิดว่าตัวอย่างทั่วไปคือการใช้ ThreadLocal ในซอร์สโค้ดของ Android เกี่ยวกับ Looper ซึ่งรวมถึงการใช้งานพื้นฐานของ ThreadLocal
Public Class Looper {String Private Static Final Tag = "Looper"; // sthreadlocal.get () จะส่งคืน null เว้นแต่คุณจะเรียกว่า PREPAL () mmainlooper ส่วนตัวคงที่ = null; sthreadlocal.set (ใหม่ looper ()); looper) {mmainlooper = looper; .. }
แต่ควรสังเกตว่าแม้ว่า ThreadLocal และ Synchonized จะใช้ในการแก้ปัญหาการเข้าถึงที่เกิดขึ้นพร้อมกันหลายเธรด แต่ก็ยังมีความแตกต่างพื้นฐานระหว่าง ThreadLocal และ Synchronized การใช้กลไกการล็อคแบบซิงโครไนซ์เพื่อให้ตัวแปรหรือบล็อกโค้ดสามารถเข้าถึงได้โดยเธรดหนึ่งในเวลาที่กำหนด ThreadLocal ให้สำเนาของตัวแปรสำหรับแต่ละเธรดเพื่อให้แต่ละเธรดไม่สามารถเข้าถึงวัตถุเดียวกันในเวลาที่กำหนดซึ่งแยกการแบ่งปันข้อมูลของข้อมูลโดยหลายเธรด ซิงโครไนซ์เป็นสิ่งที่ตรงกันข้ามมันจะใช้เพื่อรับการแบ่งปันข้อมูลเมื่อสื่อสารระหว่างหลายเธรด นั่นคือการซิงโครไนซ์ใช้สำหรับการแบ่งปันข้อมูลระหว่างเธรดในขณะที่ ThreadLocal ใช้สำหรับการแยกข้อมูลระหว่างเธรด ดังนั้น ThreadLocal ไม่สามารถแทนที่การซิงโครไนซ์และซิงโครไนซ์มีช่วงฟังก์ชันที่กว้างขึ้น (กลไกการซิงโครไนซ์)
3.Synchronized
คำหลักที่ซิงโครไนซ์จะถูกนำไปใช้โดยอัตโนมัติโดย Java โดยใช้กลไกการล็อค วัตถุทั้งหมดใน Java มีการล็อคเดียวโดยอัตโนมัติ (หรือที่เรียกว่าจอภาพ) และก่อนที่เธรดจะกลับมาจากวิธีนี้เธรดอื่น ๆ ทั้งหมดในวัตถุที่ต้องการเรียกวิธีการที่ทำเครื่องหมายไว้ในคลาสจะถูกบล็อก แน่นอนว่ายังมีล็อคสำหรับแต่ละคลาส (เป็นส่วนหนึ่งของวัตถุคลาสของคลาส) ดังนั้นคุณจึงรู้ ^. ^
ในที่สุดมันเป็นสิ่งสำคัญที่จะต้องทราบว่าการซิงโครไนซ์เป็นวิธีที่ปลอดภัยที่สุดในกลไกการซิงโครไนซ์