Atomics.isLockFree() คืออะไร
เมธอด Atomics.isLockFree() ใช้ตรวจสอบว่าการดำเนินการอะตอมิก (atomic operations) บนขนาดข้อมูลที่กำหนด สามารถทำงานได้แบบ lock-free (ไม่ใช้ล็อก) บนแพลตฟอร์มปัจจุบันหรือไม่
JavaScript engine อาจต้องใช้ล็อกภายใน (internal locks) สำหรับการดำเนินการอะตอมิกบนขนาดข้อมูลบางขนาด โดยเฉพาะขนาดที่ใหญ่กว่าที่ฮาร์ดแวร์รองรับโดยตรง เมธอดนี้ช่วยให้นักพัฒนาสามารถตรวจสอบประสิทธิภาพได้
ไวยากรณ์ (Syntax)
Atomics.isLockFree(size)
size- ขนาดในหน่วยไบต์ (bytes) ที่ต้องการตรวจสอบ (เช่น 1, 2, 4, 8)
คืนค่า: true หากการดำเนินการอะตอมิกขนาดนั้นเป็น lock-free, false หากไม่ใช่
ตัวอย่างการใช้งาน
console.log(Atomics.isLockFree(1)); // true (8-bit)
console.log(Atomics.isLockFree(2)); // true (16-bit)
console.log(Atomics.isLockFree(4)); // true (32-bit)
console.log(Atomics.isLockFree(8)); // true (64-bit) - บนระบบ 64-bit ส่วนใหญ่
console.log(Atomics.isLockFree(7)); // false (ขนาดที่ไม่มาตรฐาน)
console.log(Atomics.isLockFree(16)); // false (128-bit - มักไม่รองรับ lock-free)
ขนาดที่รองรับโดยทั่วไป
| ขนาด (bytes) | Typed Array | Lock-free บนระบบ 64-bit ทั่วไป |
|---|---|---|
| 1 | Int8Array, Uint8Array | ✅ ใช่ |
| 2 | Int16Array, Uint16Array | ✅ ใช่ |
| 4 | Int32Array, Uint32Array, Float32Array | ✅ ใช่ |
| 8 | BigInt64Array, BigUint64Array, Float64Array | ✅ ใช่ (บน 64-bit) |
ประโยชน์ของการทราบข้อมูลนี้
- ประสิทธิภาพ: การดำเนินการ lock-free เร็วกว่ามาก เพราะไม่ต้อง context switch หรือรอล็อก
- การออกแบบ: ช่วยเลือกขนาดข้อมูลที่เหมาะสมสำหรับ shared memory
- การแก้ไขปัญหา: ช่วยวินิจฉัยปัญหาประสิทธิภาพในโค้ด concurrent
ข้อควรระวัง
- ผลลัพธ์อาจแตกต่างกันไปตาม CPU architecture และ JavaScript engine
- แม้จะเป็น lock-free การดำเนินการก็ยังมี overhead จาก memory barriers
- ขนาดที่ไม่ใช่กำลังของ 2 (เช่น 3, 5, 6, 7) มักจะคืนค่า
falseเสมอ