内容简介:最近学校的氛围比较活跃,考研的复习,不考研的都在写简历准备面试。看了看,最近也没有好公司来办宣讲会,也就没了投简历的意向。最近看了看面试题,想着补一补基础,以后面几家
引言
最近学校的氛围比较活跃,考研的复习,不考研的都在写简历准备面试。
看了看,最近也没有好公司来办宣讲会,也就没了投简历的意向。最近看了看面试题,想着补一补基础,以后面几家 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安全性支持
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
HTML5经典实例
Christopher Schmitt、Kyle Simpson / 李强 / 中国电力出版社 / 2013-7 / 48.00元
《HTML5经典实例》对于从中级到高级的Web和移动Web开发者来说是绝佳之选,它帮助你选择对你有用的HTML5功能,并且帮助你体验其他的功能。个技巧的信息十分丰富,都包含了示例代码,并详细讨论了解决方案为何有效以及如何工作。一起来看看 《HTML5经典实例》 这本书的介绍吧!
JSON 在线解析
在线 JSON 格式化工具
HTML 编码/解码
HTML 编码/解码