内容简介:最近学校的氛围比较活跃,考研的复习,不考研的都在写简历准备面试。看了看,最近也没有好公司来办宣讲会,也就没了投简历的意向。最近看了看面试题,想着补一补基础,以后面几家
引言
最近学校的氛围比较活跃,考研的复习,不考研的都在写简历准备面试。
看了看,最近也没有好公司来办宣讲会,也就没了投简历的意向。最近看了看面试题,想着补一补基础,以后面几家 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
还没自增,然后线程 B
再 add
元素, size
没变,就直接把 A add
的元素覆盖了。
不安全为什么要使用?
又回到了之前向晨澍请教的问题,线程安全,必然是有额外开销的。
所以 List
的三个接口 ArrayList
、 LinkedList
和 Vector
。
线程不安全的要比线程安全的执行效率高。所以我们常用的是线程不安全的 ArrayList
、 LinkedList
,而从来没有用过线程安全的 Vector
。
Vector
自 JDK1.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);} }
总结
何处望神州?满眼风光北固楼。千古兴亡多少事?悠悠。不尽长江滚滚流。
年少万兜鍪,坐断东南战未休。天下英雄谁敌手?曹刘。生子当如孙仲谋。
——辛弃疾 《南乡子·登京口北固亭有怀》
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 【Java并发】线程安全性
- 线程的安全性(并发基础篇)
- JAVA 并发之路 (二) 线程安全性
- Spring 中获取 request 的几种方法,及其线程安全性分析
- Swift 中的安全性
- 浅谈Docker安全性支持
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
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 代码
URL 编码/解码
URL 编码/解码