คำถามติดแท็ก synchronization

การซิงโครไนซ์หมายถึงการใช้การควบคุมเพื่อรักษาการแทนที่สอดคล้องกันทั้งกลุ่มของกระบวนการที่รันโปรแกรมเดียวกัน (การซิงโครไนซ์กระบวนการ) หรือการแทนข้อมูล (การซิงโครไนซ์ข้อมูล)

8
ล็อคทำงานอย่างไร
ฉันเห็นว่าสำหรับการใช้วัตถุที่ไม่ปลอดภัยเธรดเราห่อรหัสด้วยล็อคเช่นนี้ private static readonly Object obj = new Object(); lock (obj) { // thread unsafe code } ดังนั้นจะเกิดอะไรขึ้นเมื่อหลายเธรดเข้าถึงรหัสเดียวกัน (สมมติว่ามันกำลังทำงานอยู่ในเว็บแอปพลิเคชัน ASP.NET) พวกเขาเข้าคิวหรือไม่ ถ้าเป็นเช่นนั้นพวกเขาจะรอนานแค่ไหน? ประสิทธิภาพการทำงานมีผลกระทบอะไรบ้างจากการใช้ระบบล็อค?

22
หลีกเลี่ยงการซิงโครไนซ์ (นี่) ใน Java หรือไม่
เมื่อใดก็ตามที่มีคำถามปรากฏขึ้นบน SO เกี่ยวกับการซิงโครไนซ์ Java บางคนมีความกระตือรือร้นที่จะชี้ให้เห็นว่าsynchronized(this)ควรหลีกเลี่ยง แต่พวกเขาอ้างว่าต้องการล็อคตัวอ้างอิงส่วนตัวแทน เหตุผลบางประการที่กำหนดคือ: รหัสความชั่วร้ายบางอย่างอาจขโมยล็อคของคุณ (เป็นที่นิยมมากรหัสนี้มีตัวแปร "โดยไม่ตั้งใจ") วิธีการทำข้อมูลให้ตรงกันทั้งหมดภายในชั้นเดียวกันใช้ล็อคเดียวกันแน่นอนซึ่งช่วยลดปริมาณงาน คุณกำลังเปิดเผยข้อมูลมากเกินไปโดยไม่จำเป็น คนอื่นรวมถึงฉันเถียงว่าsynchronized(this)เป็นสำนวนที่ใช้บ่อยๆ (เช่นในห้องสมุด Java) มีความปลอดภัยและเข้าใจดี ไม่ควรหลีกเลี่ยงเพราะคุณมีข้อผิดพลาดและคุณไม่รู้ว่าเกิดอะไรขึ้นในโปรแกรมแบบมัลติเธรดของคุณ กล่าวอีกนัยหนึ่ง: ถ้ามันใช้ได้แล้วใช้มัน ฉันสนใจที่จะเห็นตัวอย่างในโลกแห่งความเป็นจริง (ไม่มีสิ่งใดสำหรับ foobar) ที่หลีกเลี่ยงการล็อกบนthisจะดีกว่าเมื่อsynchronized(this)จะทำงาน ดังนั้น: คุณควรหลีกเลี่ยงsynchronized(this)และแทนที่ด้วยล็อคในการอ้างอิงส่วนตัวหรือไม่? ข้อมูลเพิ่มเติมบางส่วน (อัปเดตเมื่อได้รับคำตอบแล้ว): เรากำลังพูดถึงการประสานอินสแตนซ์ ทั้งโดยนัย ( synchronizedวิธีการ) และรูปแบบที่ชัดเจนในการsynchronized(this)ได้รับการพิจารณา หากคุณอ้างถึง Bloch หรือหน่วยงานอื่น ๆ ในเรื่องนี้อย่าปล่อยชิ้นส่วนที่คุณไม่ชอบ (เช่น Java ที่มีประสิทธิภาพ, รายการเกี่ยวกับความปลอดภัยของกระทู้: โดยปกติแล้วมันจะล็อคตัวอินสแตนซ์เอง แต่มีข้อยกเว้น) หากคุณต้องการความละเอียดในการล็อคอื่น ๆ นอกเหนือจากข้อsynchronized(this)เสนอsynchronized(this)มันจะไม่สามารถใช้ได้ดังนั้นจึงไม่ใช่ปัญหา

5
คีย์เวิร์ดที่ซิงโครไนซ์ของ Java เวอร์ชัน C # หรือไม่
c # มีคีย์เวิร์ด "ซิงโครไนซ์" ของ Java เวอร์ชันของตัวเองหรือไม่ เช่นใน java มันสามารถระบุได้ทั้งฟังก์ชั่นวัตถุหรือบล็อกของรหัสเช่น: public synchronized void doImportantStuff() { // dangerous code goes here. } หรือ public void doImportantStuff() { // trivial stuff synchronized(someLock) { // dangerous code goes here. } }

7
อะไรคือความแตกต่างระหว่างอะตอม / ระเหย / ซิงโครไนซ์?
อะตอม / ระเหย / ซิงโครไนซ์ทำงานอย่างไรภายใน ความแตกต่างระหว่างบล็อครหัสต่อไปนี้คืออะไร? รหัส 1 private int counter; public int getNextUniqueIndex() { return counter++; } รหัส 2 private AtomicInteger counter; public int getNextUniqueIndex() { return counter.getAndIncrement(); } รหัส 3 private volatile int counter; public int getNextUniqueIndex() { return counter++; } ไม่volatileทำงานในลักษณะดังต่อไปนี้หรือไม่? คือ volatile int i = 0; …


5
@synchronized lock / unlock ใน Objective-C ทำอย่างไร
@ ซิงโครไนซ์ไม่ได้ใช้ "ล็อค" และ "ปลดล็อค" เพื่อให้เกิดการยกเว้นซึ่งกันและกันหรือไม่? มันล็อค / ปลดล็อกได้อย่างไร ผลลัพธ์ของโปรแกรมต่อไปนี้เป็น "Hello World" เท่านั้น @interface MyLock: NSLock<NSLocking> @end @implementation MyLock - (id)init { return [super init]; } - (void)lock { NSLog(@"before lock"); [super lock]; NSLog(@"after lock"); } - (void)unlock { NSLog(@"before unlock"); [super unlock]; NSLog(@"after unlock"); } @end int main (int …

10
การประสานเทียบกับล็อค
java.util.concurrentAPI จัดให้มีคลาสที่เรียกว่าLockซึ่งโดยทั่วไปจะเรียงลำดับการควบคุมเพื่อเข้าถึงทรัพยากรที่สำคัญ มันทำให้วิธีการดังกล่าวเป็นและ park()unpark() เราสามารถทำสิ่งที่คล้ายกันถ้าเราสามารถใช้synchronizedคำหลักและการใช้wait()และnotify() notifyAll()วิธีการ ฉันสงสัยว่าหนึ่งในสิ่งเหล่านี้ดีกว่าในการปฏิบัติและทำไม?

8
วิธีสแตติกแบบซิงโครนัสทำงานได้อย่างไรใน Java และฉันสามารถใช้สำหรับการโหลดรายการไฮเบอร์เนตได้อย่างไร
ถ้าฉันมีคลาส util ด้วยวิธีการคงที่ที่จะเรียกใช้ฟังก์ชันไฮเบอร์เนตเพื่อให้เข้าถึงข้อมูลขั้นพื้นฐาน ฉันสงสัยว่าการทำวิธีsynchronizedนี้เป็นวิธีการที่ถูกต้องหรือไม่ ฉันต้องการสิ่งนี้เพื่อป้องกันการเข้าถึงข้อมูลไปยังอินสแตนซ์ฐานข้อมูลเดียวกัน อย่างไรก็ตามตอนนี้ฉันแน่ใจว่ารหัสต่อไปนี้จะป้องกันไม่ให้getObjectByIdถูกเรียกสำหรับคลาสทั้งหมดเมื่อถูกเรียกโดยคลาสที่เฉพาะเจาะจง public class Utils { public static synchronized Object getObjectById (Class objclass, Long id) { // call hibernate class Session session = new Configuration().configure().buildSessionFactory().openSession(); Object obj = session.load(objclass, id); session.close(); return obj; } // other static methods }

8
ตัวอย่าง / กวดวิชา Mutex? [ปิด]
ปิด. คำถามนี้ไม่เป็นไปตามหลักเกณฑ์กองมากเกิน ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นไปตามหัวข้อสำหรับ Stack Overflow ปิดให้บริการใน4 เดือนที่ผ่านมา ปรับปรุงคำถามนี้ ฉันใหม่กับมัลติเธรดและพยายามที่จะเข้าใจวิธีการทำงานของ mutex ทำ Googling มาก แต่ก็ยังมีข้อสงสัยว่ามันทำงานอย่างไรเพราะฉันสร้างโปรแกรมของตัวเองซึ่งการล็อคไม่ทำงาน หนึ่งในไวยากรณ์ที่ไม่เข้าใจง่ายของ mutex คือpthread_mutex_lock( &mutex1 );มันดูเหมือนว่า mutex กำลังถูกล็อคเมื่อสิ่งที่ฉันต้องการล็อคจริงๆคือตัวแปรอื่น ๆ ไวยากรณ์นี้หมายความว่าการล็อก mutex ล็อคขอบเขตของรหัสจนกว่า mutex จะถูกปลดล็อกหรือไม่? จากนั้นเธรดจะรู้ได้อย่างไรว่าพื้นที่ถูกล็อก [ อัพเดท: กระทู้รู้ว่าพื้นที่ถูกล็อคโดยการ ฟันดาบของหน่วยความจำ ] และปรากฏการณ์เช่นนี้ไม่ควรถูกเรียกว่าส่วนวิกฤต [ ปรับปรุง: วัตถุส่วนที่สำคัญมีอยู่ใน Windows เท่านั้นโดยที่วัตถุนั้นเร็วกว่า mutexes และสามารถมองเห็นได้เฉพาะเธรดที่ใช้งานเท่านั้น มิฉะนั้นส่วนสำคัญจะอ้างถึงพื้นที่ของรหัสที่ป้องกันโดย mutex ] ในระยะสั้นคุณสามารถช่วยด้วยโปรแกรมตัวอย่าง mutex ที่ง่ายที่สุดที่เป็นไปได้และคำอธิบายที่ง่ายที่สุดเกี่ยวกับตรรกะของวิธีการทำงาน ฉันแน่ใจว่านี้จะช่วยให้ความอุดมสมบูรณ์ของมือใหม่อื่น …

7
ความแตกต่างระหว่างตัวเลือกการซิงโครไนซ์เธรดต่าง ๆ ใน C # คืออะไร
บางคนสามารถอธิบายความแตกต่างระหว่าง: ล็อค (someobject) {} ใช้ Mutex ใช้เซมาฟอร์ ใช้การตรวจสอบ ใช้คลาสการซิงโครไนซ์. Net อื่น ๆ ฉันแค่คิดออกไม่ได้ ดูเหมือนว่าฉันสองคนแรกเหมือนกันหรือไม่

6
เธรด Java Static initializers ปลอดภัยหรือไม่
ฉันใช้บล็อกรหัสคงที่เพื่อเริ่มต้นตัวควบคุมบางตัวในรีจิสทรีที่ฉันมี ดังนั้นคำถามของฉันคือฉันสามารถรับประกันได้หรือไม่ว่าบล็อกรหัสคงที่นี้จะถูกเรียกใช้เพียงครั้งเดียวเมื่อโหลดคลาสครั้งแรก ฉันเข้าใจว่าฉันไม่สามารถรับประกันได้ว่าจะเรียกบล็อกโค้ดนี้เมื่อใดฉันคาดเดาว่าเมื่อใดที่ Classloader โหลดครั้งแรก ฉันรู้ว่าฉันสามารถซิงโครไนซ์กับคลาสในบล็อกโค้ดแบบคงที่ได้ แต่ฉันเดาว่านี่คือสิ่งที่เกิดขึ้นจริงหรือ? ตัวอย่างโค้ดง่ายๆจะเป็น; class FooRegistry { static { //this code must only ever be called once addController(new FooControllerImpl()); } private static void addController(IFooController controller) { // ... } } หรือฉันควรทำเช่นนี้ class FooRegistry { static { synchronized(FooRegistry.class) { addController(new FooControllerImpl()); } } private static void addController(IFooController …

10
C ++ 0x ไม่มี semaphores? จะซิงโครไนซ์เธรดได้อย่างไร?
C ++ 0x จะมาโดยไม่มี semaphores จริงหรือ? มีคำถามบางอย่างเกี่ยวกับ Stack Overflow เกี่ยวกับการใช้ semaphores อยู่แล้ว ฉันใช้มัน (posix semaphores) ตลอดเวลาเพื่อให้เธรดรอเหตุการณ์บางอย่างในเธรดอื่น: void thread0(...) { doSomething0(); event1.wait(); ... } void thread1(...) { doSomething1(); event1.post(); ... } ถ้าฉันจะทำแบบนั้นกับ mutex: void thread0(...) { doSomething0(); event1.lock(); event1.unlock(); ... } void thread1(...) { event1.lock(); doSomethingth1(); event1.unlock(); ... } ปัญหา: มันน่าเกลียดและไม่รับประกันว่า …


5
จะซิงโครไนซ์ตัวแปรแบบคงที่ระหว่างเธรดที่รันอินสแตนซ์ของคลาสใน Java ได้อย่างไร
ฉันรู้ว่าการใช้synchronizeคีย์เวิร์ดก่อนที่เมธอดจะนำการซิงโครไนซ์ไปยังวัตถุนั้น นั่นคือ 2 เธรดที่รันอินสแตนซ์เดียวกันของออบเจ็กต์จะซิงโครไนซ์ อย่างไรก็ตามเนื่องจากการซิงโครไนซ์อยู่ที่ระดับอ็อบเจ็กต์ 2 เธรดที่รันอินสแตนซ์ที่แตกต่างกันของอ็อบเจ็กต์จะไม่ซิงโครไนซ์ หากเรามีตัวแปรคงที่ในคลาส Java ที่ถูกเรียกโดยวิธีการเราต้องการให้มันถูกซิงโครไนซ์ข้ามอินสแตนซ์ของคลาส อินสแตนซ์ทั้งสองกำลังทำงานใน 2 เธรดที่แตกต่างกัน เราสามารถทำการซิงโครไนซ์ด้วยวิธีต่อไปนี้ได้หรือไม่? public class Test { private static int count = 0; private static final Object lock= new Object(); public synchronized void foo() { synchronized(lock) { count++; } } } เป็นความจริงหรือไม่ว่าเนื่องจากเราได้กำหนดวัตถุlockที่เป็นแบบคงที่และเรากำลังใช้คีย์เวิร์ดsynchronizedสำหรับการล็อกcountนั้นตอนนี้ตัวแปรคงถูกซิงโครไนซ์ข้ามอินสแตนซ์ของคลาสแล้วTest?

5
จะใช้คุณสมบัติ Can CancelToken ได้อย่างไร?
เมื่อเทียบกับรหัสก่อนหน้าสำหรับคลาส RulyCancelerฉันต้องการเรียกใช้โค้ดโดยใช้ CancellationTokenSource. ฉันจะใช้มันตามที่ระบุไว้ในโทเค็นการยกเลิกได้อย่างไรโดยไม่ต้องโยน / จับข้อยกเว้น ฉันสามารถใช้IsCancellationRequestedทรัพย์สินได้หรือไม่? ฉันพยายามใช้มันในลักษณะนี้: cancelToken.ThrowIfCancellationRequested(); และ try { new Thread(() => Work(cancelSource.Token)).Start(); } catch (OperationCanceledException) { Console.WriteLine("Canceled!"); } แต่สิ่งนี้ทำให้เกิดข้อผิดพลาดรันไทม์cancelToken.ThrowIfCancellationRequested();ในวิธีการWork(CancellationToken cancelToken): System.OperationCanceledException was unhandled Message=The operation was canceled. Source=mscorlib StackTrace: at System.Threading.CancellationToken.ThrowIfCancellationRequested() at _7CancellationTokens.Token.Work(CancellationToken cancelToken) in C:\xxx\Token.cs:line 33 at _7CancellationTokens.Token.<>c__DisplayClass1.<Main>b__0() in C:\xxx\Token.cs:line 22 at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.