• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

关于java:Java-中线程安全的-List

java 搞代码 3年前 (2022-02-19) 53次浏览 已收录 0个评论
文章目录[隐藏]

线程平安的 List

Java 中最罕用的列表为:ArrayListLinkedList,但这两个线程并非是线程平安的,在多线程状况就须要思考线程平安的 List

Vector

Vector 是在 JDK 1.0 中退出的,历史悠久;
底层原理和 ArrayList 简直统一,区别在于 Vector 每个公开的办法上都退出了 synchronized 保障并发平安,但性能十分底下,不举荐应用

Collections.synchronizedList()

Collections 汇合工具类提供了一个办法能够将 List 转为线程平安的 SynchronizedList

public static <T> List<T> synchronizedList(List<T> list)

原理仅是在每个办法上加上了 synchronized 来保障线程平安,相比于 Vector 扩展性,灵活性更高

public E get(int index) {
    synchronized (mutex) {return list.get(index);}
}
public E set(int index, E element) {
    synchronized (mutex) {return list.set(index, element);}
}
public void add(int index, E element) {
    synchronized (mutex) {list.add(index, element);}
}
public E remove(int index) {
    synchronized (mutex) {return list.remove(index);}
}

CopyOnWriteArrayList & CopyOnWriteArraySet

利用写时复制(COW)实现线程平安的汇合,
长处来源gaodai#ma#com搞*代#码网是有现成进行批改的时候,仍有其余线程能够读取
毛病是节约空间,每次增加删除元素就须要复制一份新数组

public boolean add(E e) {
    synchronized (lock) {
         // 获取底层存储元素的数组
        Object[] es = getArray();
        // 拷贝一份到 es 数组中
        int len = es.length;
        es = Arrays.copyOf(es, len + 1);
        // 把元素增加到开端
        es[len] = e;
        // 把批改复制回去
        setArray(es);
        return true;
    }
}

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:关于java:Java-中线程安全的-List
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址