สิ่งที่ต้องพิจารณาเมื่อเขียนโค้ดเธรดที่ปลอดภัย:
1. ตัวแปรที่ใช้ร่วมกัน
2. ตัวแปรที่ไม่แน่นอน
การแชร์หมายความว่าหลายเธรดสามารถเข้าถึงได้พร้อมๆ กัน และการไม่แน่นอนหมายความว่าค่าของเธรดสามารถเปลี่ยนแปลงได้ตลอดวงจรการใช้งาน
ตัวอย่างเช่น ตัวแปรการนับต่อไปนี้:
คัดลอกรหัสรหัสดังต่อไปนี้:
//คลาสเธรดที่ไม่ปลอดภัย
คลาสสาธารณะ UnsafeCount {
int ส่วนตัว = 0; // ตัวแปรนี้ถูกแชร์
public void เพิ่ม () { //ไม่มีกลไกการซิงโครไนซ์ที่นี่ สามารถเข้าถึงหลายเธรดได้ในเวลาเดียวกัน
count++; //ตัวแปรนี้เป็นตัวแปร
-
สาธารณะ int getCount() {
การนับผลตอบแทน;
-
-
มี 4 วิธีในการแก้ไขปัญหานี้:
1. แทนที่จะแชร์ตัวแปรสถานะระหว่างเธรด คุณสามารถสรุปตัวแปรลงในเมธอดได้ (ออบเจ็กต์ไร้สัญชาติจะต้องปลอดภัยสำหรับเธรด) เนื่องจากตัวแปรในเมธอดเป็นแบบเอกสิทธิ์เฉพาะบุคคลสำหรับแต่ละเธรดและไม่ได้แชร์กับเธรดอื่น ตัวอย่างเช่น:
คัดลอกรหัสรหัสดังต่อไปนี้:
เพิ่ม int สาธารณะ (นับ int) {
return ++count;//อาจกล่าวได้ที่นี่ว่าวัตถุไร้สัญชาติจะต้องปลอดภัยต่อเธรด
-
2. แก้ไขตัวแปรสถานะให้เป็นตัวแปรที่ไม่เปลี่ยนรูป
คัดลอกรหัสรหัสดังต่อไปนี้:
จำนวน int สุดท้ายส่วนตัว = 0;
3. ใช้กลยุทธ์การซิงโครไนซ์เมื่อเข้าถึงตัวแปรสถานะ
คัดลอกรหัสรหัสดังต่อไปนี้:
โมฆะการซิงโครไนซ์สาธารณะเพิ่มขึ้น () {
นับ++;
-
4. ใช้คลาสตัวแปรอะตอมมิก
คัดลอกรหัสรหัสดังต่อไปนี้:
จำนวน AtomicInteger ส่วนตัว
โมฆะสาธารณะเพิ่มขึ้น () {
count.getAndAdd(1);
-