zoukankan      html  css  js  c++  java
  • Java线程安全同步容器

    线程安全同步容器(使用 synchronized关键字)

    1.ArrayList->Vector,Stack

    2.HashMap->HashTable(key、value不能为null)

    3.Collections.synchronizedXXX(List、Set、Map)

    同步容器也有线程不安全的情况 stack继承vector

    package com.alan.concurrency.example.syncContainer;
    
    import com.alan.concurrency.annoations.NotThreadSafe;
    import com.alan.concurrency.annoations.ThreadSafe;
    import lombok.extern.slf4j.Slf4j;
    
    import java.util.Vector;
    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Semaphore;
    
    
    @Slf4j
    @NotThreadSafe
    public class VectorExample2 {
    
        private static Vector<Integer> vector = new Vector<>();
    
        public static void main(String[] args) {
            
            
            while (true){
    
                for (int i = 0; i < 10; i++) {
                    vector.add(i);
                }
    
                Thread thread1 = new Thread(){
                    public void run(){
                        for (int i = 0; i < vector.size(); i++) {
                            vector.remove(i);
                        }
                    }
                };
    
                Thread thread2 = new Thread(){
                    public void run(){
                        for (int i = 0; i <vector.size(); i++) {
                            vector.get(i);
                        } 
                    }
                };
    
                thread1.start();
                thread2.start();
            }
            
        }
    }

    HashTable同步容器

    package com.alan.concurrency.example.syncContainer;
    
    import com.alan.concurrency.annoations.NotThreadSafe;
    import lombok.extern.slf4j.Slf4j;
    
    import java.util.HashMap;
    import java.util.Hashtable;
    import java.util.Map;
    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Semaphore;
    
    @Slf4j
    public class HashTableExample {
    
        // 请求总数
        public static int clientTotal = 5000;
    
        // 同时并发执行的线程数
        public static int threadTotal = 200;
    
        private static Map<Integer, Integer> map = new Hashtable<>();
    
        public static void main(String[] args) throws Exception {
            ExecutorService executorService = Executors.newCachedThreadPool();
            final Semaphore semaphore = new Semaphore(threadTotal);
            final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
            for (int i = 0; i < clientTotal; i++) {
                final int count = i;
                executorService.execute(() -> {
                    try {
                        semaphore.acquire();
                        update(count);
                        semaphore.release();
                    } catch (Exception e) {
                        log.error("exception", e);
                    }
                    countDownLatch.countDown();
                });
            }
            countDownLatch.await();
            executorService.shutdown();
            log.info("size:{}", map.size());
        }
    
        private static void update(int i) {
            map.put(i, i);
        }
    }

    Collections.synchronized相关同步容器

    1、public static List<Integer> list = Collections.synchronizedList(new ArrayList<>()) ;
    2、 public static Set<Integer> set = Collections.synchronizedSet(new HashSet<>()) ;
    3、 private static Map<Integer, Integer> map = Collections.synchronizedMap(new HashMap<>()) ;


  • 相关阅读:
    清理计算机硬盘
    DIY-组装
    go函数类型的使用
    go同步互斥锁
    Go读写文件
    go mod
    go html
    channel
    arp和rarp协议
    自己实现的反射
  • 原文地址:https://www.cnblogs.com/shamo89/p/10220891.html
Copyright © 2011-2022 走看看