一 高性能
1 低延迟 (响应快)
2 高并发 (吞吐量高)
二 提升性能的办法
1 减低延迟
1.1 消息队列 将处理的数据交给消息队列然后返回一个响应给客户端 降低响应时间
1.2 增加缓存 降低响应时间
2 提高吞吐量(增加线程 -> 并发)
2.1 多台服务器做负载均衡 提高吞吐量
2.2 数据库 分库、分表
2.3 集群服务器
三 多线程
1 可见性
2 有序性
3 原子性
四 对象在内存中的存储布局
4.1 markword存储的信息: 所谓的上锁就是修改markword的锁信息
4.1.1 锁信息
加锁前和加锁后
4.1.2 GC信息 垃圾回收器 三色标识
4.1.3 Hashcode信息 identify hashcode
五 synchronized锁 (Java自带)
5.1 互斥锁
5.2 所谓的上锁就是修改markword
5.3 缺点
5.3.1 操作系统进行处理效率比较慢
5.3.2 加锁后,同一时刻只能有一个线程运行
5.3.3 上锁过程不可以被打断
5.3.4 非公平锁 没有排队等待调用
六 J.U.C
6.1 核心:CAS + AQS
6.2 CAS (compare and swap)(自旋锁)
取代了加锁的机制。(0依然)
当线程读完(0)并操作(+1)然后需要写回时,比较存储的值是不是和刚开始的时候(0)一样,如果与原来的值一样(0)就写入(1);不一样就将现在的值(..)重新读出并接着进行操作直至某次操作时和原来的一样就写入,此次操作完成
6.3 可能的问题:
1 ABA问题(0->8->0,此0非彼0)
解决办法:加版本号
2 原子性
A操作B时必须一气呵成 否则可能会有C加入
解决办法:
使用原子操作 最终在汇编语言上使用了lock comxchg
6.4 cas与synchronized比较
1 cas自选等待锁的过程一直消耗cpu,synchronized则在达到一定的级别后将其放入队列中消耗调度时间的cpu
2 cas与操作系统的交互次数少 称为轻量级锁 而synchronized交互多 成为重量级锁
3 分场景看效率
取决于作业处理的时间和等待线程的个数
时间少 线程少 使用cas
时间长 线程多 使用synchronized