并发情况下删除集合中的元素

public class ListTest {

    public static void main(String[] args) {
        CountDownLatch downLatch = new CountDownLatch(10);
        List<String> list = new ArrayList<>();
        list.add("2");
        list.add("2");
        list.add("11");
        list.add("11");
        list.add("3");
        list.add("3");
        for (int i=0;i<10;i++){
            doTask(downLatch, list);
        }
    }

    private static void doTask(CountDownLatch downLatch, List<String> list) {
        try {
            for (int i = 0; i < 10; i++) {
                new Thread(() -> {
                    deleteItem(list);
                    downLatch.countDown();
                }).start();
            }
            downLatch.await();
            System.out.println(list);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void deleteItem(List<String> list) {
        Lock lock = new ReentrantLock();
        Iterator<String> iterator = list.iterator();
        lock.lock();
        try {
            while (iterator.hasNext()) {
                String val = iterator.next();
                if (val.equals("2")) {
                    iterator.remove();
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }

    }

}

原文地址:https://www.cnblogs.com/coderMark/p/8416577.html

时间: 2024-08-05 04:06:38

并发情况下删除集合中的元素的相关文章

java循环中如何删除集合中的元素

public void remove(){   List<String> list = new ArrayList<String>();   list.add("a");   list.add("b");   list.add("a");   list.add("c");   list.add("d");   Iterator<String> it = list.iter

Java循环删除集合多个元素的正确打开方式

首先说下不正确的打开方式: 第一:使用for循环删除集合的元素,示例代码如下 1 ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d")); 2 for (int i = 0; i < list.size(); i++) { 3 list.remove(i); 4 } 5 System.out

单链表在不知头结点的情况下对第i个元素的删除

一.首先,看看单链表中第i个元素的删除: Status ListDelete_L (LinkList &L,int i,ElemType &e){ //在带头结点的单链表L中,删除第i个元素,并由e返回其值 p=L;j=0; while(p->next&&j<i-1){                     //寻找第i个结点,并令p指向其前驱 p=p->next; ++j; } if(!(p->next)||j<i-1)return ERR

如何删除JAVA集合中的元素

经常我们要删除集合中的某些元素.有些可能会这么写. public void operate(List list){ for (Iterator it = list.iterator(); it.hasNext();) { String str = (String)it.next(); if (str.equals("chengang")){ list.remove(str); } } } 这种写法一运行就会报如下异常: Exception in thread "main&qu

如何正确遍历删除List中的元素(普通for循环、增强for循环、迭代器iterator、removeIf+方法引用)

遍历删除List中符合条件的元素主要有以下几种方法: 普通for循环 增强for循环 foreach 迭代器iterator removeIf 和 方法引用 (一行代码搞定) 其中使用普通for循环容易造成遗漏元素的问题,增强for循环foreach会报java.util.ConcurrentModificationException并发修改异常. 所以推荐使用迭代器iterator,或者JDK1.8以上使用lambda表达式进行List的遍历删除元素操作. 以下是上述几种方法的具体分析: 1.

sql server中高并发情况下 同时执行select和update语句死锁问题 (一)

 最近在项目上线使用过程中使用SqlServer的时候发现在高并发情况下,频繁更新和频繁查询引发死锁.通常我们知道如果两个事务同时对一个表进行插入或修改数据,会发生在请求对表的X锁时,已经被对方持有了.由于得不到锁,后面的Commit无法执行,这样双方开始死锁.但是select语句和update语句同时执行,怎么会发生死锁呢?看完下面的分析,你会明白的- 首先看到代码中使用的查询的方法Select <span style="font-size:18px;"> /// &

Jackson高并发情况下,产生阻塞

情况:在高并发情况下,查看线程栈信息,有大量的线程BLOCKED. 从线程栈得知,线程栈中出现了阻塞,锁在了com.fasterxml.jackson.databind.ser.SerializerCache.untypedValueSerializer(SerializerCache.java:74)上. 1 "catalina-exec-1453" #1525 daemon prio=5 os_prio=0 tid=0x00007f1010098800 nid=0x2675 wai

解决并发情况下库存减为负数问题

场景: 一个商品有库存,下单时先检查库存,如果>0,把库存-1然后下单,如果<=0,则不能下单,事务包含两条sql语句: select quantity from products WHERE id=3; update products set quantity = ($quantity-1) WHERE id=3; 在并发情况下,可能会把库存减为负数(两个进程同时select出来的都>0,然后都会执行update),所以需要加锁, InnoDB支持通过特定的语句进行显示加锁: sele

在jsp中选中checkbox后 将该记录的多个数据获取,然后传到Action类中进行后台处理 双主键情况下 *.hbm.xml中的写法

在jsp中选中checkbox后 将该记录的多个数据获取,然后传到Action类中进行后台处理 双主键情况下 *.hbm.xml中的写法 ==========方法1: --------1. 选相应的checkbox后  点删除按钮------------- <!-- *******************删除******************* -->     <input type="image" alt="delete"      src=&