java 多线程 往list中add

pujitan978 2019-08-16 02:12:29
25个线程,每个线程把准备好的数据往一个全局arraylist中add ,会不会有问题呢?
以前做C#遇到过问题,同时redim会异常,java 是不是也会有问题。有替代线程安全的吗?
...全文
692 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_32771135 2019-08-21
  • 打赏
  • 举报
回复
ArrayList 源码里add方法,赋值就是一个简单的 size++, 所以在多线程的时候是不安全的,赋值会互相覆盖,而且在扩容的时候也会有问题,可以用 Vector 线程安全的list,不过效率会低点

public boolean add(E e) {
        ensureCapacityInternal(size + 1);  
        elementData[size++] = e;
        return true;
    }
对梦想的牵挂 2019-08-21
  • 打赏
  • 举报
回复
可以尝试以下几种方法: Vector比Arraylist安全一点。要额外加锁才能保证线程安全,很老的类了 COW实现是读不加锁,写加锁。只能保证数据的最终一致性,不能保证数据的实时一致性,写操作很慢 Collections.synchronizedList(),读写都加锁,写操作比COW快得多
baichangda234 2019-08-16
  • 打赏
  • 举报
回复
如果你在写的时候同时需要读,采用 ReentrantReadWriteLock 读些锁分离 使用 reentrantReadWriteLock.writeLock() 来锁住写 使用 reentrantReadWriteLock.readLock() 来锁住读 写写锁、读写锁互斥 读读锁可以并行 这个方案算是很高效的了
pujitan978 2019-08-16
  • 打赏
  • 举报
回复
二楼的加锁,效率会不会变慢啊,处理非常频繁。
ninuxGithub 2019-08-16
  • 打赏
  • 举报
回复

Collections.synchronizedList



class CopyOnWriteArrayList {
  public boolean add(E e) {
     //添加的时候上锁
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            Object[] elements = getArray();
            int len = elements.length;
            Object[] newElements = Arrays.copyOf(elements, len + 1);
            newElements[len] = e;
            setArray(newElements);
            return true;
        } finally {
            lock.unlock();
        }
    }
}
maradona1984 2019-08-16
  • 打赏
  • 举报
回复
自己百度,java线程安全的List实现,实在不行,写一个add方法,做线程同步

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧