ฉันเพิ่งสร้างวิธีการแบบซิงเกิลตันและฉันต้องการทราบว่าฟังก์ชัน@synchronized()
นี้ทำหน้าที่อะไรเนื่องจากฉันใช้บ่อย แต่ไม่รู้ความหมาย
ฉันเพิ่งสร้างวิธีการแบบซิงเกิลตันและฉันต้องการทราบว่าฟังก์ชัน@synchronized()
นี้ทำหน้าที่อะไรเนื่องจากฉันใช้บ่อย แต่ไม่รู้ความหมาย
คำตอบ:
มันประกาศส่วนสำคัญรอบ ๆ บล็อกโค้ด ในโค้ดมัลติเธรด@synchronized
รับประกันว่าเธรดเดียวเท่านั้นที่สามารถรันโค้ดนั้นในบล็อกได้ตลอดเวลา
หากคุณไม่ทราบว่ามันทำอะไรแสดงว่าแอปพลิเคชันของคุณอาจไม่ใช่แบบมัลติเธรดและคุณอาจไม่จำเป็นต้องใช้มัน (โดยเฉพาะอย่างยิ่งหากซิงเกิลตันนั้นไม่ปลอดภัยต่อเธรด)
แก้ไข: การเพิ่มข้อมูลเพิ่มเติมบางส่วนที่ไม่ได้อยู่ในคำตอบเดิมจากปี 2554
@synchronized
สั่งป้องกันไม่ให้หลายหัวข้อจากการเข้าสู่ภูมิภาคใด ๆ ของรหัสที่ได้รับการคุ้มครองโดย@synchronized
สั่งหมายถึงวัตถุเดียวกัน วัตถุที่ส่งผ่านไปยัง@synchronized
คำสั่งคือวัตถุที่ใช้เป็น "ตัวล็อก" เธรดสองเธรดสามารถอยู่ในขอบเขตที่มีการป้องกันเดียวกันได้หากใช้อ็อบเจ็กต์อื่นเป็นตัวล็อกและคุณยังสามารถป้องกันโค้ดสองภูมิภาคที่แตกต่างกันโดยสิ้นเชิงโดยใช้อ็อบเจ็กต์เดียวกันกับล็อก
นอกจากนี้หากคุณบังเอิญผ่านnil
เป็นวัตถุล็อคจะไม่มีการล็อคเลย
@synchronized
และเชื่อมโยงไปบางส่วนเอกสารเกี่ยวกับแอปเปิ้ล
จากเอกสารของ Apple ที่นี่และที่นี่ :
คำสั่ง @synchronized เป็นวิธีที่สะดวกในการสร้างล็อค mutex ได้ทันทีในรหัส Objective-C คำสั่ง @synchronized ทำในสิ่งที่การล็อค mutex อื่น ๆ จะทำ - ป้องกันไม่ให้เธรดต่างๆได้รับการล็อกเดียวกันในเวลาเดียวกัน
เอกสารประกอบให้ข้อมูลมากมายเกี่ยวกับเรื่องนี้ มันคุ้มค่าที่จะสละเวลาอ่านโดยเฉพาะอย่างยิ่งเมื่อคุณใช้มันโดยไม่รู้ว่ามันทำอะไร
@synchronized
สั่งเป็นวิธีที่สะดวกในการสร้างล็อค mutex ในการบินในObjective-Cรหัส
@synchronized
สั่งไม่สิ่งใด ๆ ล็อค mutex อื่น ๆ จะทำมันป้องกันไม่ให้หัวข้อที่แตกต่างจากการแสวงหาล็อคเดียวกันในเวลาเดียวกัน
ไวยากรณ์:
@synchronized(key)
{
// thread-safe code
}
ตัวอย่าง:
-(void)AppendExisting:(NSString*)val
{
@synchronized (oldValue) {
[oldValue stringByAppendingFormat:@"-%@",val];
}
}
ตอนนี้รหัสด้านบนปลอดภัยเธรดอย่างสมบูรณ์ตอนนี้หลายเธรดสามารถเปลี่ยนค่าได้
ข้างต้นเป็นเพียงตัวอย่างที่คลุมเครือ ...
@synchronized(val, oldValue) { ... }
?
@synchronized บล็อกจับโดยอัตโนมัติล็อกและปลดล็อกสำหรับคุณ @ ซิงโครไนซ์คุณมีการล็อกโดยนัยที่เชื่อมโยงกับวัตถุที่คุณใช้ในการซิงโครไนซ์ นี่คือการสนทนาที่ให้ข้อมูลเกี่ยวกับหัวข้อนี้โปรดติดตาม@synchronized lock / unlock ใน Objective-C อย่างไร?
คำตอบที่ยอดเยี่ยมที่นี่:
ช่วยทำความเข้าใจวิธีการเรียนที่ส่งคืนซิงเกิลตัน
พร้อมคำอธิบายเพิ่มเติมเกี่ยวกับกระบวนการสร้างซิงเกิลตัน
@synchronized
เป็นthread safe
กลไก ชิ้นส่วนของโค้ดที่เขียนภายในฟังก์ชันนี้จะกลายเป็นส่วนหนึ่งcritical section
ซึ่งสามารถดำเนินการได้ทีละเธรดเท่านั้น
@synchronize
ใช้การล็อกโดยปริยายในขณะที่NSLock
ใช้อย่างชัดเจน
รับประกันความปลอดภัยของด้ายเท่านั้นไม่รับประกันว่า สิ่งที่ฉันหมายถึงคือคุณจ้างคนขับผู้เชี่ยวชาญสำหรับรถของคุณ แต่ก็ยังไม่รับประกันว่ารถจะไม่ประสบอุบัติเหตุ อย่างไรก็ตามความน่าจะเป็นยังคงน้อยที่สุด
@synchronized
นั้นจะไม่ทำอะไรเลยคุณจะไม่ได้รับการป้องกัน 2)@synchronized
เป็นช้า