ArrayList->Vector,Stack
HashMap->HashTable(key,value不能为null)
Collections.synchronizedXXX(List、Set、Map)
- import com.mmall.concurrency.annoations.ThreadSafe;
- import lombok.extern.slf4j.Slf4j;
- import java.util.List;
- 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
- @ThreadSafe
- public class VectorExample1 {
- // 请求总数
- public static int clientTotal = 5000;
- // 同时并发执行的线程数
- public static int threadTotal = 200;
- private static List<Integer> list = new Vector<>();
- 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:{}", list.size());
- }
- private static void update(int i) {
- list.add(i);
- }
- }
同步容器不一定是线程安全的,例如:
- import com.mmall.concurrency.annoations.NotThreadSafe;
- import java.util.Vector;
- @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();
- }
- }
- }
- import java.util.Iterator;
- import java.util.Vector;
- public class VectorExample3 {
- // java.util.ConcurrentModificationException
- private static void test1(Vector<Integer> v1) { // foreach
- for(Integer i : v1) {
- if (i.equals(3)) {
- v1.remove(i);
- }
- }
- }
- // java.util.ConcurrentModificationException
- private static void test2(Vector<Integer> v1) { // iterator
- Iterator<Integer> iterator = v1.iterator();
- while (iterator.hasNext()) {
- Integer i = iterator.next();
- if (i.equals(3)) {
- v1.remove(i);
- }
- }
- }
- // success
- private static void test3(Vector<Integer> v1) { // for
- for (int i = 0; i < v1.size(); i++) {
- if (v1.get(i).equals(3)) {
- v1.remove(i);
- }
- }
- }
- public static void main(String[] args) {
- Vector<Integer> vector = new Vector<>();
- vector.add(1);
- vector.add(2);
- vector.add(3);
- test1(vector);
- }
- }
HashTable 线程安全
- import com.mmall.concurrency.annoations.ThreadSafe;
- 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
- @ThreadSafe
- 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提供的同步容器
- import com.google.common.collect.Lists;
- import com.mmall.concurrency.annoations.ThreadSafe;
- import lombok.extern.slf4j.Slf4j;
- import java.util.Collections;
- import java.util.List;
- 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
- @ThreadSafe
- public class CollectionsExample1 {
- // 请求总数
- public static int clientTotal = 5000;
- // 同时并发执行的线程数
- public static int threadTotal = 200;
- private static List<Integer> list = Collections.synchronizedList(Lists.newArrayList());
- 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:{}", list.size());
- }
- private static void update(int i) {
- list.add(i);
- }
- }
- import com.google.common.collect.Sets;
- import com.mmall.concurrency.annoations.ThreadSafe;
- import lombok.extern.slf4j.Slf4j;
- import java.util.Collections;
- import java.util.Set;
- import java.util.concurrent.CountDownLatch;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- import java.util.concurrent.Semaphore;
- @Slf4j
- @ThreadSafe
- public class CollectionsExample2 {
- // 请求总数
- public static int clientTotal = 5000;
- // 同时并发执行的线程数
- public static int threadTotal = 200;
- private static Set<Integer> set = Collections.synchronizedSet(Sets.newHashSet());
- 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:{}", set.size());
- }
- private static void update(int i) {
- set.add(i);
- }
- }
- import com.mmall.concurrency.annoations.ThreadSafe;
- import lombok.extern.slf4j.Slf4j;
- import java.util.Collections;
- import java.util.HashMap;
- 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
- @ThreadSafe
- public class CollectionsExample3 {
- // 请求总数
- public static int clientTotal = 5000;
- // 同时并发执行的线程数
- public static int threadTotal = 200;
- private static Map<Integer, Integer> map = Collections.synchronizedMap(new HashMap<>());
- 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);
- }
- }
- import java.util.Iterator;
- import java.util.Vector;
- public class VectorExample3 {
- // java.util.ConcurrentModificationException
- private static void test1(Vector<Integer> v1) { // foreach
- for(Integer i : v1) {
- if (i.equals(3)) {
- v1.remove(i);
- }
- }
- }
- // java.util.ConcurrentModificationException
- private static void test2(Vector<Integer> v1) { // iterator
- Iterator<Integer> iterator = v1.iterator();
- while (iterator.hasNext()) {
- Integer i = iterator.next();
- if (i.equals(3)) {
- v1.remove(i);
- }
- }
- }
- // success
- private static void test3(Vector<Integer> v1) { // for
- for (int i = 0; i < v1.size(); i++) {
- if (v1.get(i).equals(3)) {
- v1.remove(i);
- }
- }
- }
- public static void main(String[] args) {
- Vector<Integer> vector = new Vector<>();
- vector.add(1);
- vector.add(2);
- vector.add(3);
- test3(vector);
- }
- }