ArrayList 线程安全性学习

栏目: Java · 发布时间: 5年前

内容简介:最近学校的氛围比较活跃,考研的复习,不考研的都在写简历准备面试。看了看,最近也没有好公司来办宣讲会,也就没了投简历的意向。最近看了看面试题,想着补一补基础,以后面几家

引言

最近学校的氛围比较活跃,考研的复习,不考研的都在写简历准备面试。

看了看,最近也没有好公司来办宣讲会,也就没了投简历的意向。最近看了看面试题,想着补一补基础,以后面几家 Spring Cloud 的企业,去和面试官交流交流。

Spring Cloud 的学习与体会

最近看了《 Spring Cloud 微服务实战》一书,感觉受益匪浅,大有裨益。

高并发应用,必须是要启用 Spring Cloud 的。有了 Spring Cloud ,就不用再像之前一样,前端工程师团队,后端工程师团队,运维团队。而是按模块划分,订单模块团队,支付模块团队,每个团队里都是从前端到后台到运维的全栈工程师。

就像上次黄庭祥说的, ThinkPHP 开发,他写学期管理; AngularJS 开发,他又写学期管理; Angular 开发,他还写学期管理。想到什么了么?肯定精通这个模块的业务逻辑啊?

如果培养出优秀的支付模块团队、优秀的安全模块团队、优秀的高并发优化团队,其实淘宝也不过如此。

相互的依赖,从原来的 @Autowired 转为服务器接口间的调用。每个模块都是一个 Spring Cloud 应用,各应用间通过互相调用、相互协作共同实现业务功能,同时,各应用模块可以采用不同的数据库,以发挥各数据库之所长。

然后后台分布式部署,到了并发的时候,给相应的模块加服务器负载均衡就是了。个人中心模块,不常用,两个服务器负载;订单模块,可能会并发,加个百十来个服务器负载均衡。当然,像 618 、双十一这样的场景,肯定不是加服务器就能解决的,我这里只是举个简单的例子。模块划分之后,可以有针对性地解决高并发问题。

不扯淡了,开始进入正题。

面试题

再谈线程安全

什么是线程安全?

我看到这道题就感觉怎么也说不出来,就是多线程的环境下运行,我这个应用也不炸,虽然是这个意思,但是也不能这样回答啊?一时之间,找不到相关的学术词汇回答此问题。

这是想了许久后,我自己总结出的回答:

程序在单线程环境下正常执行得到了正确的结果,在多个线程并发执行的环境条件下,仍然能得到像单线程一样正确的结果,这就是线程安全。

如果一个类(或对象),我们在使用时,无需考虑任何多线程相关的问题,就像单线程一样使用,且最后能得到正确的结果,那就说这个类(或对象)是线程安全的。

ArrayList 线程安全吗?

看了许多面试题,发现面试官都喜欢以一个小方面进行切入,然后无限扩展,直到把面试者问懵圈为止。

ArrayList 线程安全吗?

虽然天天用 ArrayList ,但是真的没考虑过这个问题。其实, ArrayList 线程不安全。

ArrayList 是一个内部采用数组实现的线性表,它相比数组最大的优点就是使用时可以不用去像数组一样 new 的时候去考虑要容纳多少个元素。 ArrayList 默认构造一个容量为 10 的数组。

private static final int DEFAULT_CAPACITY = 10;

如果容量不够了, ArrayList 会自动扩容,扩容至原来的 1.5 倍。(右移一位,相当于除以 2 )。

int newCapacity = oldCapacity + (oldCapacity >> 1);

ArrayList 没有对多线程问题进行处理,举个 add 方法的例子就能证明它线程不安全。

elementData[size++] = e;

别看这是一行,其实是执行了两步操作,赋值和自增。

线程 A add 一个元素,然后暂停执行, size 还没自增,然后线程 Badd 元素, size 没变,就直接把 A add 的元素覆盖了。

不安全为什么要使用?

又回到了之前向晨澍请教的问题,线程安全,必然是有额外开销的。

所以 List 的三个接口 ArrayListLinkedListVector

线程不安全的要比线程安全的执行效率高。所以我们常用的是线程不安全的 ArrayListLinkedList ,而从来没有用过线程安全的 Vector

VectorJDK1.0 就存在,设计得不够完善,多线程情况下如果使用不当也会发生错误,不推荐使用。

如何解决线程不安全

既然 Vector 不能用,那我就想要一个线程安全的 List 得怎么整呢?

调用 Collections.synchronizedList 方法,使 ArrayList 线程安全。

List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());

返回 SynchronizedList 类的对象,经典的装饰器模式,对方法访问加了同步。

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

总结

何处望神州?满眼风光北固楼。千古兴亡多少事?悠悠。不尽长江滚滚流。

年少万兜鍪,坐断东南战未休。天下英雄谁敌手?曹刘。生子当如孙仲谋。

——辛弃疾 《南乡子·登京口北固亭有怀》


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Fluent Python

Fluent Python

Luciano Ramalho / O'Reilly Media / 2015-8-20 / USD 39.99

Learn how to write idiomatic, effective Python code by leveraging its best features. Python's simplicity quickly lets you become productive with it, but this often means you aren’t using everything th......一起来看看 《Fluent Python》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

URL 编码/解码
URL 编码/解码

URL 编码/解码