คลาส 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ซึ่งมีประสิทธิภาพดีกว่า