1、书籍
Java编程思想
企业架构模式
Java并发编程实战
2、注册中心
Redis
zookeeper
SpringCloud
3、IO
BIO 阻塞IO
NIO 非阻塞
4、Netty
用到的技术Future
5、消息中间件
RabbitMQ,RocketMQ,ActiveMQ,Kafka
6、MQ
场景1
两系统间的数据通信,一个生产一个消费,两者不是一个节拍
后系统会产生一个严重的内存的堆积,最后内存溢出
使用消息中间件,做缓冲
场景2
分布式系统
数据生产,统一放到MQ中,然后生成订阅关系
减少系统间交织的接口的复杂性
RPC Dubbos
7、线程安全
多个线程访问某一个类或对象或方法时,这个类
始终都能表现出正确的行为
【1】无static的方法,关键字synchronized取得的锁都是对象锁
线程持有该方法所属对象的锁
【2】关键字synchronized如果修饰的是静态的方法
相当于在类上加锁,独占.Class类
private AtomicInteger num 原子性的
sychronized 可以在任意的对象及方法上加锁,而加锁的这段代码
称为互斥区或临界区
多个线程访问某线程的run方法时,以排队的方式进行处理
这里排队是按照CPU分配的先后顺序而定的,不是按照线程在
代码中创建的顺序执行的
8、对象锁的同步和异步
同步synchronized
同步的概念就是共享,如果不是共享的资源,就没有必要进行同步
异步asychronized
异步的概念就是独立,相互之间不受到任何制约
就好像我们学习http时,在页面发起的ajax请求,我们可以继续浏览或操作页面的内容
二者之间没有任何关系
同步的目的就是为了线程安全,对于线程安全来说,需要满足两个特性:
原子性
可见性
对象是一把锁,如果对象的属性发生变化是不影响锁的
9、业务数据的脏读
如果设置值得方法耗时较长
或者值得方法耗时短,会产生脏数据,即数据不一致的情况
在我们对一个对象的方法加锁的时候,需要考虑业务的整体性
即为setValue/getValue方法,同时加synchronized同步关键字
保证业务的原子性,不让回出现业务的错误
数据库的ACID
A 原子性
C 一致性
I 隔离性
D 永久性
10、锁重入
当一个线程得到一个对象的锁后,再次请求
此对象时是可以再次得到该对象的锁
如:执行一个队列任务,很多对象都去在
等待一个对象正确执行完毕再去释放锁
但是第一个对象由于异常的出现,导致业务逻辑
没有正常执行完毕,就释放了锁,后续的对象执行的都是
错误的逻辑
11、volatile