同時プログラミング-コレクション

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