ฉันเพิ่งสร้างวิธีการแบบซิงเกิลตันและฉันต้องการทราบว่าฟังก์ชัน@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เป็นช้า