ในยุคของการประมวลผลแบบหลายคอร์ที่พัฒนาไปอย่างรวดเร็ว Java concurrency (การทำงานพร้อมกันในภาษาจาวา) กลายเป็นหัวข้อที่นักพัฒนาซอฟต์แวร์จำเป็นต้องมีความเข้าใจในระดับหนึ่ง เพื่อให้แอปพลิเคชันของพวกเขาสามารถใช้ประโยชน์จากแพลตฟอร์มพื้นฐานได้อย่างเต็มที่ ในบทความนี้ เราจะนำเสนอ 5 เทคนิค Java concurrency ยอดนิยมพร้อมตัวอย่างในการใช้งาน ที่จะช่วยให้นักพัฒนาวางโครงการที่มีประสิทธิภาพสูงได้
การใช้ Threads เป็นกลยุทธ์ที่พื้นฐานและเริ่มต้นในการสร้างแอปพลิเคชันที่ใช้ Java concurrency. Thread สามารถถูกสร้างขึ้นผ่านการ implements `Runnable` interface หรือการ extends `Thread` class.
ตัวอย่าง:
class HelloThread extends Thread {
public void run() {
System.out.println("Hello from a thread!");
}
public static void main(String args[]) {
(new HelloThread()).start();
}
}
class HelloRunnable implements Runnable {
public void run() {
System.out.println("Hello from a Runnable!");
}
public static void main(String args[]) {
(new Thread(new HelloRunnable())).start();
}
}
เมื่อรันโค้ดเหล่านี้แล้ว ผลลัพธ์ที่ได้คือมีการพิมพ์ข้อความทักทายจากทั้ง thread และ runnable.
การเข้าถึงแหล่งข้อมูลที่มีการแชร์ระหว่าง threads อาจทำให้เกิดปัญหาคอนฟลิกต์ เพื่อหลีกเลี่ยงสิ่งนี้ Java มีคำสั่ง `synchronized`, ใช้เพื่อควบคุมการเข้าถึง methods หรือ blocks โดย threads หลายๆ ตัว.
ตัวอย่าง:
public class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public int getCount() {
return count;
}
}
ในตัวอย่างนี้เมื่อ thread ใดเข้ามาเรียก `increment()`, จะไม่มี thread อื่นสามารถเข้าถึงเมธอดนี้ได้จนกว่า thread แรกจะทำงานเสร็จ.
Java Concurrency API นำเสนอ locks ที่มีการทำงานละเอียดอ่อนมากขึ้นเมื่อเทียบกับ `synchronized`. `Lock` ออกแบบมาเพื่อให้นักพัฒนามีการควบคุมที่ดีขึ้นของการ lock.
ตัวอย่าง:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class CounterWithLock {
private final Lock lock = new ReentrantLock();
private int count = 0;
public void increment() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
public int getCount() {
return count;
}
}
Java Concurrency API จัดหา collections ที่เหมาะสำหรับการใช้งานในสภาวะ concurrent environment เช่น `ConcurrentHashMap`, `CopyOnWriteArrayList`, และ `BlockingQueue`.
ตัวอย่าง:
import java.util.concurrent.ConcurrentHashMap;
public class ConcurrentMapExample {
public static void main(String[] args) {
ConcurrentHashMap map = new ConcurrentHashMap<>();
map.put("key", "value");
// การเข้าถึง map จะสามารถทำได้โดยปลอดภัยแม้จะมีการแก้ไขโดยอื่นๆ parallel
}
}
Executor framework เป็นเครื่องมือที่มีประสิทธิภาพสำหรับการจัดการ threads ซึ่งช่วยลด overhead ที่เกี่ยวข้องกับการสร้างและการจัดการ threads อย่างต่อเนื่อง.
ตัวอย่าง:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class ExecutorExample {
public static void main(String[] args) {
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> {
System.out.println("Task #1");
});
try {
if (!executor.awaitTermination(800, TimeUnit.MILLISECONDS)) {
executor.shutdownNow();
}
} catch (InterruptedException e) {
executor.shutdownNow();
}
}
}
เครื่องมือเหล่านี้เป็นส่วนหนึ่งของการพัฒนาโปรแกรม Java ที่มีประสิทธิภาพ และเป็นพื้นฐานที่สำคัญสำหรับนักพัฒนาที่ต้องการสร้างแอปพลิเคชันที่แข็งแรง และทำงานได้ดีในสิ่งแวดล้อมที่มีการประมวลผลขนาดใหญ่หรือการคำนวณที่ต้องใช้ทรัพยากรมาก. การเรียนรู้วิธีการใช้เทคนิคเหล่านี้อย่างชาญฉลาดจะช่วยให้คุณสามารถสร้างระบบที่มีการทำงานร่วมกันของ threads ได้มากมาย และเพิ่มความสามารถในการทำงานของแอปพลิเคชัน ไม่ว่าจะเป็นเรื่องของ Scalability หรือ Resilience.
โปรแกรมมิ่งไม่ใช่เพียงแค่การเขียนโปรแกรมให้ทำงานได้เท่านั้น แต่ยังรวมถึงการทำให้โปรแกรมนั้นทำงานได้ดียิ่งขึ้นอีกด้วย การทำความเข้าใจในการทำงานพร้อมกันของ Java คือหัวใจหลักของการพัฒนาซอฟต์แวร์ที่มั่นคงและรวดเร็ว สำหรับนักพัฒนาที่เล็งเห็นความสำคัญนี้ โรงเรียนการเขียนโปรแกรมอย่าง EPT ได้จัดเตรียมหลักสูตรและโปรแกรมการสอนที่จะช่วยพัฒนาทักษะเหล่านี้ โดยไม่ต้องกังวลว่าจะกลายเป็นการโฆษณาที่จู้จี้จุกจิก การเรียนรู้ผ่านทางการศึกษาที่สม่ำเสมอและมีอุปกรณ์และสภาพแวดล้อมการเรียนรู้ที่เหมาะสมนั้น เป็นลางบอกเหตุของความสำเร็จที่ยั่งยืนบนเส้นทางของนักพัฒนาซอฟต์แวร์.
หมายเหตุ: ข้อมูลในบทความนี้อาจจะผิด โปรดตรวจสอบความถูกต้องของบทความอีกครั้งหนึ่ง บทความนี้ไม่สามารถนำไปใช้อ้างอิงใด ๆ ได้ ทาง EPT ไม่ขอยืนยันความถูกต้อง และไม่ขอรับผิดชอบต่อความเสียหายใดที่เกิดจากบทความชุดนี้ทั้งทางทรัพย์สิน ร่างกาย หรือจิตใจของผู้อ่านและผู้เกี่ยวข้อง
หากเจอข้อผิดพลาด หรือต้องการพูดคุย ติดต่อได้ที่ https://m.me/expert.Programming.Tutor/
Tag ที่น่าสนใจ: java_concurrency threads synchronization locks concurrent_collections executor_framework programming multithreading
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM
Copyright (c) 2013 expert-programming-tutor.com. All rights reserved. | 085-350-7540 | 084-88-00-255 | ntprintf@gmail.com