面试官眼中的高并发
我们面试的时候,常常被问到“有用到高并发的场景么?”“你怎么理解高并发的?”“你是怎么处理高并发的?”。每次遇到这种面试问题,我脑海中就会浮现出缓存、分表分库、读写分离、索引、前后端分离、加锁这些技术。感觉回答的很泛。这里面内容太多,有时候绕着绕着都把自己绕晕了。说白了,我也不知道面试官想听的是哪些点。我猜,面试官应该是想听到实践使用的场景吧。比如线程池,共享计数器,抢红包活动之类的。
线程安全的API
高并发的容器,也称为线程安全的容器,如HashTable、SynchronizedHashMap、ConcurretHashMap、Vectory、CopyOnWriteArrayList、CopyOnWriteSet、ThreadLocal。高并发的计数器,AutomaticLong、LongAdder。线程控制,如CountDownLantch、CycleBarrier。线程安全变量修饰符,如voilatile。锁修饰符synchronize、Lock等。每个jkd的api都是用了很经典的算法,都是一些值得一用的接口。当然了,有一些性能更佳,如LongAdder、ConcurrentHashMap。LongAdder用了分段自旋锁的方式。ConcurrentHashMap用了分段锁的方式,核心都是在高并发的情况下,减少冲突,提高效率。
安全和性能
说到高并发,当然要提到安全和性能了。首先,安全指的是在高并发的情况下,不会出现数据结果不一致的情况,不会出现死锁或死循环。一段代码在多个线程运行和一个线程运行的结果始终保持一致,我们就成为这段代码是线程安全的。jdk里面也有很多不安全的api,如ArrayList、HashMap。其中HashMap被很多人踩过坑,在jdk的api接口中HashMap.get()方法出现了死循环。根本原因就是其内部的rehash方法不是线程安全的,进入了死循环的代码段。说到性能,就有很多可以优化的了,如加缓存、加索引、读写分离、前后端分离,乐观锁。
总结
最后在文章的末尾,我想说的是有时候我们的知识很碎片化,时间也碎片化,如何才能把我们所掌握的知识系统化、条理化?这个是我要思考的问题。当然,不断的总结和写作也不失为一种办法。总结不到位,觉得有点太笼统了,达不到深度。这两天看公众号架构师之路的作者shenjian,也有被评论者说写文章越来越水了,被质疑是不是没有干货了。其实,我觉得不是没有干货了,而是没有系统化。有时候会被一些深不深、浅不浅的问题困惑,就会出现这种情况,好像苹果为什么会掉下来一样。看穿了是万有引力,看不穿就是很简单的常识问题。虽然是常识,也要思考原因本质不是?
2019年6月7日修正如下:
互联网高并发有两个办法,垂直扩展和水平扩展。
垂直扩展包含硬件扩展,更换更好的硬盘,加大内存,加宽网络等,还包含软件应用的扩展,加缓存,
同步变异步,sql优化,多线程等。
水平扩展是互联网的终极武器,加实例,加机子。