Concurrent3
Volatile variable(ตัวแปร เปลี่ยนแปลงง่าย?)
ถ้ามีหลายthreadมาประมวลผล โค๊ดนี้จะได้outputเป็น
-42
-never terminate
-0 (ค่าของ number ตอนแรกสุดที่สร้างตัวแปรไว้)
***
การประกาศตัวแปรให้เป็น volatile
private volatile static boolean ready; private volatile static int number; |
คือการบอกให้ compiler และ runtime รู้ว่า ตัวแปรนี้shareอยู่
เวลามีการประมวลผลคำสั่ง จะได้ระวัง ไม่ให้มี คำสั่งอื่นมาประมวลผลแทรก?
***
Atomicity of variable in Java
ตัวแปรทั่วไปถือเป็น atomic หมด คือ แบ่งแยกไม่ได้
ยกเว้น long กับ double เพราะถ้าเป็น 64 bit จะเกํบค่าเป็น 32+32
ซึ่งคำสั่งอื่นสามารถเข้ามาทำงานแทรกกลาง ตอนกำลัง อ่าน-เขียน ค่าได้
***
Critical section problem
critical section (พื้นที่วิกฤต) โค๊ดในส่วนนี้ จะห้าม ไม่ให้มี thread 2 ตัวมาประมวลผลพร้อมกัน
การจะเป็น critical section ได้ ต้องมีองค์ประกอบ 3 อย่าง
1.Mutal exclusion (กีดกันการใช้ร่วมกัน?) -critical section ของทั้ง 2 โปรเซส จะไม่ interleave กัน (ไม่กระโดดข้ามไปมา ทำอันใดอันนึงให้เสร็จไปก่อน)
2.Freedom from deadlock (ปราศจากการติดตาย)-ไม่ว่าโปรเซสใดๆก็สามารถเข้า critical section ได้?
3.Freedom from starvation (ปราศจากความอดอยาก) - ถ้ามีโปรเซสใดๆอยากเข้า critical sectionของมันเอง? ท้ายที่สุดมันก็จะได้เข้า
วิธีการปกป้อง critical section
1.Atomic read & Atomic write of variable = ทำงานทีละคำสั่งไปสิ แต่ใช้งานได้ยากในทางปฏิบัติ แค่ใช้ในการจำลองได้เข้าใจง่าย
2.Semaphor (สัญญานธง) เห็นว่า ใช้ Monitor จะดีกว่า
3.Monitor คือการ synchronize อะไรซักอย่าง
มาลองเช็ค โค๊ดแบบ atomic read write ดูว่า critical section ok มั๊ย