CopyOnWriteArraySet
CopyOnWriteArrayList
นี่คือน้องชายของชั้น เหล่านี้เป็นชุดคลาสพิเศษที่เพิ่มเข้ามาใน JDK 1.5 พร้อมด้วยลูกพี่ลูกน้องที่ได้รับความนิยม
ConcurrentHashMap
มากกว่า เป็นส่วนหนึ่ง
concurrent collection framework
และอยู่ในบรรจุ
java.util.concurrent
ภัณฑ์
![วิธีใช้ CopyOnWriteArraySet ใน Java พร้อมตัวอย่าง (การแปล) - 1]()
CopyOnWriteArraySet
เหมาะที่สุดสำหรับคอลเลกชันแบบอ่านอย่างเดียวที่มีขนาดเล็กพอที่จะคัดลอกได้ หากมีการดำเนินการแก้ไขบางอย่างเกิดขึ้น ตัวอย่างเช่น คุณสามารถใช้
CopyOnWriteArraySet
เพื่อจัดเก็บออบเจ็กต์เมื่อแอปพลิเคชันเริ่มทำงาน และให้เธรดอื่นๆ หลายเธรดเข้าถึงออบเจ็กต์นั้นตลอดวงจรชีวิตของแอปพลิเคชัน หากมีสถานะหรือออบเจ็กต์ใหม่เข้ามาในช่วงเวลานี้ ก็อาจถูกเพิ่มเข้าไปในสถานะหรือออบเจ็กต์นี้ด้วย
Set
โดยต้องเสียค่าใช้จ่ายในการสร้างอาร์เรย์ใหม่ สิ่งสำคัญที่สุดประการหนึ่งที่ต้องรู้
CopyOnWriteArraySet
คือมีการใช้งานโดยใช้
CopyOnWriteArrayList
. ซึ่งหมายความว่ามัน
CopyOnWriteArraySet
ยังใช้คุณสมบัติพื้นฐานทั้งหมดของ
CopyOnWriteArrayList
. สิ่งสำคัญอีกประการหนึ่งที่ต้องจำก็คือตัววนซ้ำของคลาสคอลเลกชันนี้ไม่รองรับไฟล์
remove()
. การพยายามลบองค์ประกอบระหว่างการรวมจะส่งผลให้เกิดค่าผิด
UnsupportedOperationException
ปกติ ทำเช่นนี้เพื่อให้แน่ใจว่ามีความเร็วระหว่างการรวบรวมข้อมูล การข้ามการใช้งานนี้
Set
โดยใช้ตัววนซ้ำนั้นค่อนข้างรวดเร็วและหลีกเลี่ยงการรบกวนจากเธรดอื่น ในการทำงาน ตัววนซ้ำอาศัยสแน็ปช็อตของอาร์เรย์ที่ถ่ายเมื่อสร้างตัววนซ้ำ กล่าวโดยสรุป ให้ใช้
CopyOnWriteArraySet
หาก
set
มีขนาดเล็กพอที่จะคัดลอกเมื่อเพิ่ม ตั้งค่า หรือลบออบเจ็กต์ และจุดประสงค์หลักคือเพื่ออ่านข้อมูลที่อัปเดตเป็นระยะ นอกจากนี้ หากคุณต้องการลบองค์ประกอบระหว่างการวนซ้ำ อย่าใช้การดำเนินการนี้เนื่องจากตัววนซ้ำไม่รองรับ
remove()
และพ่น
java.lang.UnsupportedOperationException
ดังที่แสดงด้านล่าง:
[RAJ] Event received : FOUR
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.concurrent.CopyOnWriteArrayList$COWIterator.remove(Unknown Source)
at Publisher.notifySubs(HelloHP.java:43)
at HelloHP.main(HelloHP.java:23)
ตัวอย่าง CopyOnWriteArraySet ใน Java
นี่คือโปรแกรม Java สำเร็จรูปที่แสดงวิธีการใช้งาน
CopyOnWriteArraySet
. ในตัวอย่างของเรา เราใช้รูปแบบผู้เผยแพร่
-subscriberเพื่อสาธิตการใช้งาน สมาชิกส่วนใหญ่สมัครรับข้อมูลในระหว่างการเปิดตัวแอปพลิเคชันและงานหลักของผู้จัดพิมพ์คือการแจกแจงและแจ้งให้พวกเขาทราบถึงการอัปเดตใด ๆ การเพิ่มและการลบสมาชิกอาจเกิดขึ้นเป็นครั้งคราว เนื่องจากเราต้องการการบายพาสที่รวดเร็ว
CopyOnWriteArraySet
นี่จึงเป็นตัวเลือกที่ดี โดยเฉพาะอย่างยิ่งในสภาพแวดล้อมแบบมัลติเธรด โดยที่เธรดหนึ่งสามารถเพิ่มสมาชิกได้ ในขณะที่อีกเธรดหนึ่งจัดการการอัปเดต
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArraySet;
public class CopyOnWriteArraySetDemo{
public static void main(String args[]) {
Publisher cricNext = new Publisher();
SubScriber raj = new SubScriber("RAJ");
SubScriber adom = new SubScriber("ADOM");
cricNext.addSubscriber(raj);
cricNext.addSubscriber(adom);
cricNext.notifySubs("FOUR");
cricNext.notifySubs("SIX");
}
}
class Publisher {
private CopyOnWriteArraySet setOfSubs = new CopyOnWriteArraySet();
public void addSubscriber(SubScriber sub) {
setOfSubs.add(sub);
}
public void notifySubs(String score) {
Iterator itr = setOfSubs.iterator();
while (itr.hasNext()) {
SubScriber sub = itr.next();
sub.receive(score);
}
}
}
class SubScriber {
private String _name;
public SubScriber(String name) {
this._name = name;
}
public void receive(String score) {
System.out.printf("[%s] Event received : %s %n", _name, score);
}
}
เอาท์พุท:
[RAJ] Event received : FOUR
[ADOM] Event received : FOUR
[RAJ] Event received : SIX
[ADOM]Event received : SIX
สิ่งที่ต้องจำ
CopyOnWriteArraySet
ใช้งาน
Collection
and interfaces
Set
เช่นเดียวกับที่เพิ่มใน JDK 1.5 พร้อมกับการใช้งานที่กำหนดเองอื่นของ
Set
'a,
EnumSet
. นอกจากนี้ยังเป็น
Set
สิ่งหนึ่งที่ใช้ภายใน
CopyOnWriteArrayList
สำหรับการดำเนินการทั้งหมด ดังนั้นจึงมีคุณสมบัติพื้นฐานเดียวกันของคลาสนี้ เนื่องจากไม่ใช่ จึง
SortedSet
ไม่รับประกันลำดับขององค์ประกอบในระหว่างการวนซ้ำ
-
CopyOnWriteArraySet
เหมาะที่สุดสำหรับการใช้งานโดยที่:
- ขนาด
Set
ของ ' มักจะยังเล็กอยู่
- การดำเนินงาน
read-only
มีความเหนือกว่าการดำเนินงานที่ปรับเปลี่ยนวัตถุอย่างมาก
- คุณต้องป้องกันการรบกวนระหว่างเธรดระหว่างการข้าม
Set
ผ่าน
- ข้อดีอีกประการหนึ่ง
CopyOnWriteArraySet
คือความปลอดภัยของด้าย คอลเลกชันนี้รองรับการทำงานพร้อมกัน
- การดำเนินการกลายพันธุ์ (การเพิ่ม การแก้ไข การลบ ฯลฯ) มีราคาแพง เนื่องจากโดยปกติแล้วจะต้องคัดลอกอาร์เรย์พื้นฐานทั้งหมด
- ตัววนซ้ำไม่สนับสนุนการดำเนินการลบแบบกลายพันธุ์
- การข้ามผ่านโดยใช้ตัววนซ้ำนั้นค่อนข้างเร็ว และระหว่างนั้น การรบกวนของเธรดอื่นจะถูกแยกออก ในการทำงาน ตัววนซ้ำอาศัยสแน็ปช็อตของอาร์เรย์ที่ถ่ายเมื่อสร้างตัววนซ้ำ
นั่นคือทั้งหมดที่เกี่ยวกับการใช้งาน
CopyOnWriteArraySet
ใน Java อย่างที่บอกไปว่าเขาเป็นน้อง
CopyOnWriteArrayList
ชาย ดังนั้นหากคุณเข้าใจอย่างน้อยหนึ่งรายการ คุณสามารถใช้อีกรายการหนึ่งได้ ข้อแตกต่างเพียงอย่างเดียวคืออันหนึ่งคือ
List
'' และอีกอัน
Set
คือ '' ดังนั้นสิ่งนี้จึงนำมาซึ่งความแตกต่างทั้งหมดระหว่างโครงสร้างข้อมูลเหล่านี้ใน Java ตัวอย่างเช่น
List
ลำดับขององค์ประกอบมีความสำคัญและอาจมีการซ้ำกัน แม้ว่าจะ
Set
ไม่เรียงลำดับ แต่ก็ไม่อนุญาตให้มีการทำซ้ำวัตถุ โปรดจำไว้เสมอว่า
CopyOnWriteArraySet
นี่คือ
Collection
ชั้นเรียน พิเศษ ควรใช้เมื่อมีเงื่อนไขเอื้ออำนวยเท่านั้น ในกรณีอื่น คุณสามารถใช้การใช้งานเพื่อวัตถุประสงค์ทั่วไปได้ ตัวอย่างเช่น
HashSet
หรือ
LinkedHashSet
คลาสคอลเลกชันที่ซิงโครไนซ์ ต้นฉบับ:
วิธีใช้ CopyOnWriteArraySet ใน Java พร้อมตัวอย่าง
GO TO FULL VERSION