同時プログラミング-コレクション
12296 ワード
普通の集合
ListSetMap、同時環境下、遍歴中の更新操作は許可されていません(添削)
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class CollectionDemo {
public static void main(String[] args) {
List list=new ArrayList<>();
for (int i = 0; i < 20; i++) {
User user = new User(i, "User" + i);
list.add(user);
}
//java.util.ConcurrentModificationException
// Iterator it=list.iterator();
// while(it.hasNext()){
// User user=it.next();
// if("User6".equals(user.getName()))
// list.remove(user);
// }
for (int i = 0; i < 20; i++){
if(i % 2 == 0){
User user = (User)list.get(i);
// , ,3 2,
list.remove(user);
}
}
System.err.println(list);
}
}
同時集合
ノンブロッキングコレクション(Non-Blocking Collection)ConcurrentLinkedDeque
このようなセットには、データを追加および削除する方法も含まれます.メソッドが直ちに実行されない場合はnullまたは例外が放出されますが、このメソッドを呼び出すスレッドはブロックされません.
≪インスタンス|Instance|emdw≫
リストに大量のデータを追加します.
同じリストから大量のデータを削除します.
import java.util.concurrent.ConcurrentLinkedDeque;
public class CollectionDemo01 {
public static void main(String[] args) throws InterruptedException{
ConcurrentLinkedDeque list=new ConcurrentLinkedDeque();
//
Thread[] add=new Thread[100];
for (int i = 0; i < 100; i++) {
add[i]=new Thread(()->{
for (int j = 0; j < 10000; j++) {
list.add(Thread.currentThread().getName()+":Element "+j);
}
});
add[i].start();
add[i].join();
}
System.out.println("after add size:"+list.size());
//
Thread[] poll=new Thread[100];
for (int i = 0; i < 100; i++) {
poll[i]=new Thread(()->{
for (int j = 0; j < 5000; j++) {
list.pollLast();
list.pollFirst();
}
});
poll[i].start();
poll[i].join();
}
System.out.println("after poll size:"+list.size());
}
}
ブロッキング・コレクション(Blocking Collection)LinkedBlockingDeque
ブロッキングコレクション(Blocking Collection):このようなコレクションには、データを追加および削除する方法が含まれます.セットがいっぱいまたは空の場合、呼び出された追加または削除メソッドはすぐに実行されず、このメソッドを呼び出すスレッドは、メソッドが正常に実行されるまでブロックされます.
import java.util.Date;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.TimeUnit;
public class BlockDequeDemo {
public static void main(String[] args) {
LinkedBlockingDeque list=new LinkedBlockingDeque(3);
Thread thread=new Thread(()->{
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 5; j++) {
String str=new String(i+":"+j);
try {
list.put(str.toString());
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("client:"+str+(new Date()));
}
}
});
thread.start();
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 3; j++) {
try {
String str=list.take();
System.out.println("main:take "+str+" size:"+list.size());
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println("end");
}
}
import com.sun.javafx.animation.TickCalculation;
import java.util.Random;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
public class CarDemo {
public static void main(String[] args) {
// Semaphore
Semaphore sp=new Semaphore(5);
Thread[] car=new Thread[10];
for (int i = 0; i < 10; i++) {
car[i]=new Thread(()->{
//
try {
sp.acquire();
System.out.println(Thread.currentThread().getName()+" ");
} catch (InterruptedException e) {
e.printStackTrace();
}
//
try {
int val= new Random().nextInt(10);
TimeUnit.SECONDS.sleep(val);
System.out.println(Thread.currentThread().getName()+" "+val+" ");
} catch (InterruptedException e) {
e.printStackTrace();
}
// ( )
try {
sp.release();
System.out.println(Thread.currentThread().getName()+" ");
} catch (Exception e) {
e.printStackTrace();
}
},"car["+i+"]");
car[i].start();
}
}
}
ArrayBlockingQueue ConcurrentHashMap ConcurrentLinkedQueue ConcurrentSkipListMap ConcurrentSkipListSet CopyOnWriteArrayList CopyOnWriteArraySet
転載先:https://www.cnblogs.com/yintingting/p/11428575.html