java并发编程
1、什么是高并发
- 并发:指的是CPU同时处理多个任务,就是多个线程同时处理一个资源,单核CPU不是同时,而是通过分配时间段交替执行。
- 高并发是一种互联网分布式架构设计,就是通过这种设计保证系统能够同时并行处理很多请求。
2、高并发常用指标
- 响应时间:系统对请求做出响应的时间。例如系统处理一个HTTP请求需要200ms,这个200ms就是系统的响应时间。
- 吞吐量:单位时间内处理的请求数量。
- QPS:每秒响应请求数。在互联网领域,这个指标和吞吐量区分的没有这么明显。
- 并发用户数:同时承载正常使用系统功能的用户数量。例如一个即时通讯系统,同时在线量一定程度上代表了系统的并发用户数。
3、互联网分布式架构设计,提高系统并发能力的方式
- 垂直扩展:提升单击处理能力。垂直扩展的方式分为两种:
- 增强单机硬件性能,例如:增加CPU核数如32核,升级更好的网卡如万兆,升级更好的硬盘如SSD,扩充硬盘容量如2T,扩充系统内存如128G;
- 提升单机架构性能,例如:使用Cache来减少IO次数,使用异步来增加单服务吞吐量,使用无锁数据结构来减少响应时间。
- 水平扩展
- 集群
- 分布式
- 站点式扩展:Nginx反向代理
- 服务层扩展:RPC框架实现远程调用,SpringBoot/SpringCloud
- 数据层扩展
4.其它
- sleep和wait
- sleep是线程中的方法,但是wait是Object中的方法。
- sleep方法不会释放lock,但是wait会释放,而且会加入到等待队列中。
- 线程锁表示Lock对象执行了锁定操作,其他的线程都必须等这个线程完成,并释放锁之后,才能执行被锁住的代码块
- sleep方法不依赖于同步器synchronized,但是wait需要依赖synchronized关键字。
- sleep不需要被唤醒(休眠之后推出阻塞),但是wait需要(不指定时间需要被别人中断)。
- synchronized和Lock的区别
- synchronized启动上锁,自动释放锁,Lock手动上锁,手动释放锁。
- synchronized无法判断是否获取到了锁,Lock可以判断是否拿到了锁。
- synchronized拿不到锁就会一直等待,Lock不一定会一直等待。
- synchronized是java关键字,Lock是接口。
- synchronized是非公平锁,Lock可以设置是否为公平锁。