Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

วิธีทำให้ Collection เป็น Thread-Safe ใน Java

คลาส java.util.Collections มีเมธอดสำหรับห่อหุ้ม (Wrap) Collection ธรรมดาให้กลายเป็น Thread-Safe (ปลอดภัยต่อเธรด) โดยคืนค่าเป็น View ที่ซิงโครไนซ์ไว้แล้ว

เมธอดหลักที่ใช้บ่อย

เมธอด คำอธิบาย
synchronizedCollection(Collection<T> c) คืน Collection ที่ Thread-Safe
synchronizedList(List<T> list) คืน List ที่ Thread-Safe
synchronizedMap(Map<K,V> m) คืน Map ที่ Thread-Safe
synchronizedSet(Set<T> s) คืน Set ที่ Thread-Safe
synchronizedSortedMap(SortedMap<K,V> m) คืน SortedMap ที่ Thread-Safe
synchronizedSortedSet(SortedSet<T> s) คืน SortedSet ที่ Thread-Safe

ตัวอย่างการใช้งาน

import java.util.Collection;
import java.util.Collections;
import java.util.Vector;

public class ThreadSafeCollection {
    public static void main(String[] args) {
        Vector<String> vector = new Vector<>();
        vector.add("JavaFx");
        vector.add("Java");
        vector.add("WebGL");
        vector.add("OpenCV");
        
        System.out.println("Original: " + vector);
        
        // ห่อหุ้มให้ Thread-Safe
        Collection<String> syncVector = Collections.synchronizedCollection(vector);
        
        System.out.println("Synchronized: " + syncVector);
        syncVector.add("CoffeeScript"); // ใช้งานได้ปกติ
    }
}

ผลลัพธ์

Original: [JavaFx, Java, WebGL, OpenCV]
Synchronized: [JavaFx, Java, WebGL, OpenCV]

ข้อควรระวัง

  • Iterator ที่ได้จาก Collection ที่ซิงโครไนซ์ ไม่ได้เป็น Thread-Safe เอง ต้องซิงโครไนซ์ด้วยตนเองระหว่าง Iterate
  • ใน Java 5+ ควรพิจารณาใช้ java.util.concurrent เช่น ConcurrentHashMap, CopyOnWriteArrayList ซึ่งมีประสิทธิภาพดีกว่า