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 มั๊ย