1,多线程顺序执行
**join()和newSingleThreadExecutor()**
public static void main(String[] args) {
// try {
// thread1.start();
// //main线程必须等待join线程执行完毕
// thread1.join();
// thread2.start();
// //main线程必须等待join线程执行完毕
// thread2.join();
// thread3.start();
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
//创建只有一个线程的线程池,底层是无界阻塞队列: LinkedBlockingQueue
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(thread1);
executor.submit(thread2);
executor.submit(thread3);
executor.shutdown();
}
2,synchronize的同步原理
synchronized锁什么时候释放?
- 获取锁的线程执行完毕,会释放锁
- 线程执行出现异常会释放锁
synchronized和lock的区别?
- Lock可以主动去释放锁, synchronized是被动的释放锁;
- Lock实现了比较丰富的锁,包含ReentrantLock,ReadLock,WriteLock 锁等;
- Lock是一个接口,由java语言实现;synchronized是一个关键词,是内置c语言实现
- 竞争资源比较激烈的情况,Lock锁性能要强
3,Mysql中的 binlog
binlog是一个二进制的日志文件,记录MySQL的数据更新或者潜在更新(删除一条不存在的数据)。
主从复制就是依靠binlog。
binlog日志格式有3种:
- statement(默认): 基于SQL语句 insert
- row 基于行模式,update table set value = x ; 10000条,记录10000条变更的数据
- mixed : 根据SQL语句进行判断,选择第一种还是第二种
4,cookie和session的联系和区别
分布式可以使用Redis存放,
5,消息的选型:rabbitMQ,activeMQ,Kafka,rocketMQ
- 从社区活跃度:rabbitMQ活跃度最高;
- 持久化消息比较:ActiveMq 和RabbitMq 都支持;
- 综合技术比较:包含可靠性,灵活的路由,集群,事务,高可用的队列,消息排序,问题追踪,可视化管理工具,插件系统等等。rabbitmq和kafka最好;
- 高并发:rabbitMQ最好,底层实现语言erlang天生具备高并发高可用特性;
- 关注点比较:rabbitmq比kafka成熟,在可用性,稳定性,可靠性上rabbitmq胜于kafka;
- kafka比较适合大数据的场景,同时kafka定位主要在日志等方面,因为kafka设计的初衷就是处理日志。
参考链接:消息的选型
6,Redis集群和分布式寻址算法
节点之间的通信机制:集中式和gossip协议。
分布式寻址算法:
- hash算法(缺点:增加和减少节点时缓存命中率下降,导致大量缓存重建)
- 一致性hash算法(自动缓存迁移)+ 虚拟节点(自动负载均衡)
- Redis cluster 的hash slot 算法
判断节点宕机:ping了之后,指定超时时间内没有返回pong,认为pfail; ping给其他节点,如果超过半数节点都认为pfail了,那么就会变成fail。
参考链接:Redis集群模式和分布式寻址
7、HashMap和TreeMap的区别
HashMap基于哈希表,无序;TreeMap基于红黑树,常用于排序
参考链接:HashMap和TreeMap的区别