java知识点
1.spring的事务传播种类?
*REQUIRED -- 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
*REQUIRES_NEW -- 新建事务,如果当前存在事务,把当前事务挂起。
*NEVER -- 以非事务方式执行,如果当前存在事务,则抛出异常。
SUPPORTS -- 支持当前事务,如果当前没有事务,就以非事务方式执行。
MANDATORY -- 支持当前事务,如果当前没有事务,就抛出异常。
NOT_SUPPORTED -- 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
NESTED -- 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与 REQUIRED 类似的操作
2.i++是否线程安全?如果不是有什么办法让他变安全?
不安全,synchonized(自动),lock(手动),concurrent下atomic子包,java.util.concurrent.atomic.AtomicInteger/AtomicLong/AtomicBoolean
3.线程池的原理?有哪些重要的参数?
ThreadPool
工作线程数 5
排队队列-上限 100
最大线程数 10
最大超时时间 30秒
4.spring的aop实现原理?
aop切面
代理:jdk代理(有接口),cglib代理(继承)
Proxy.newProxyInstance(object.getClassLoader(), new Class[] { object }, this);
5.两个线程去修改一个数,初始值是100,一个线程加十次,每次加10,一个线程减去十次,每次减10,不加任何锁,最终结果是多少?
随机
6.并发包下面有哪些并发工具?
1、常用的并发集合类
*ConcurrentHashMap
CopyOnWriteArrayList
CopyOnWriteArraySet
ArrayBlockingQueue
LinkedBlockingQueue
2、原子类
*AtomicInteger
3、锁
ReentrantLock 可重入锁
ReentrantReadWriteLock 可重入锁分读(共享锁)+写(独享锁)
7.dubbo和zookeeper的原理,组成模块?
注册中心->zookeeper,发布与订阅功能
消费者
提供方
监控中心
8.redis的原理?
redis是单线程,不存在并发问题,没有线程切换开销,而且是内存操作,速度很快
9.jvm垃圾回收机制算法?
引用计数法:Object a = new Object();缺点:解决不了循环依赖的问题!
标记清除法:* (*) * (*) * * * *,清除掉!缺点:内存碎片化
复制法:[****][****],内存分成2部分一样空间,将存活对象,拷贝到另一块,原始区域全部清除!缺点:只有一半空间使用
标记整理法:结合了[标记清除法]+[复制],存活移动到另一侧连续性区域,再清除,好处:解决碎片化,空间利用高
分代回收法:年轻代(Erden-8,Servior1-1,Servior2-1),老年代,永久代(类,静态,方法)->大部分jvm使用的算法
10.IO和NIO的区别?
io:阻塞;一个请求,一个线程
nio:none bloking io 非阻塞io;基于事件通知,一个线程,处理多个请求;节省线程开销
netty:nio框架,传统nio写法复杂有bug,netty封装修复掉,dubbo底层可以使用netty/mina作为rpc通讯框架
11.装饰器模式原理,jdk哪里用到了?
class Animal{say()}
class Man extends Animal{say(){super();do();}}
class Teacher extends Man{say(){super();do();}}
12.索引的结构?B tree的结构?
二叉树,左边的永远小于右边的
13.深copy和浅copy区别
浅拷贝:继承clone方法,User对象clone()方法,new User对象,把属性全部拷贝过去
/**
* 浅拷贝
*/
@Override
protected Object clone() throws CloneNotSupportedException {
User user = new User();
user.name = this.name;
user.password = this.password;
user.card = this.card;//Card是另外一个类
return user;
}
深拷贝:不仅对象,而且所有属性也拷贝,实现方式:序列化/反序列化
14.hashcode和equals区别
hashcode,方便查找,类似md5哈希散列算法,不同值可以对应同一个hash值
equals,是表示两个对象相等
hashcode相等,equals不一定相等;equals相等,hashcode一定相等
用处:hashMap,set
15.怎么防止form表单重复提交
jsp渲染form界面,form中放一个token(uuid)提交到后端,判断token是否来过
16.Thread.sleep()和object.wait()区别
new -> 就绪状态 <-> 运行状态 -> 阻塞(synchronized/lock/sleep/wait)/完成
sleep一定时间自动回到就绪状态
wait阻塞,通过notify/notifyAll竞争到就绪状态
17.乐观锁和悲观锁区别
乐观锁:version版本,可以并发,但是有可能报错
悲观锁:for update,不允许并发,性能较低
18.TreeMap是怎么比较元素的
HashMap无序,TreeMap有序
红黑树算法,平衡二叉树,左旋,右旋,让左右的等级相差在1内
比较:实现Comparable接口/穿进去一个comparable实现类
@Override
public int compareTo(User o) {
if(null == o) {
return 1;
}
return this.name.compareTo(o.name);
}
19.ThreadLocal实现原理
ThreadLocal里存放数据,每个线程,单独持有自己的那份,不会线程竞争
/**
* 通过匿名内部类覆盖ThreadLocal的initialValue()方法,指定初始值
* 使得同一个线程的uuid是一样的
*/
public static ThreadLocal<String> uuid = new ThreadLocal<String>() {
/**
* 初始值
*/
public String initialValue() {
return "[uuid:" + UUID.randomUUID().toString() + "] : ";
}
};
get();
set();
20.redis的线程模型是什么
单线程
21.rabbitmq能保证消息可靠性么?怎么保证?
rabbitmq支持落地,重启还在;消费完返回标示,如果抛异常,会再次消费
22.dubbo的负载均衡策略
轮询,随机,加权轮询,加权随机,最近最少使用
23. spring bean的生命周期
new bean
IOC注入
BeanNameAware setName
BeanFactoryAware setFactory
BeanPostProcessor before
InitializingBean afterPropertiesSet
Spring配置文件 init-method
BeanPostProcessor after
DisposableBean destory
Spring配置文件 destroy-method
24. spring是怎么实现@Transactional,TransactionStatus作用是什么?
aop,之前开启事务,后面提交事务,回滚事务
TransactionStatus看事务状态,当前是否有事务,事务传播属性,隔离级别
web.xml中定义一个过滤器,spring代码也定义一个过滤器,先后顺序是什么?
先web再spring
25. java对象头部有哪些字段,有什么用处?
无锁 hashcode,分代年龄,锁标志
轻量锁 锁指针 锁标志
重量锁 锁指针 锁标志
偏向锁 ...
26. 线程有哪些状态,之间怎么流转的?
状态参考上面问题
一个线程去竞争锁的时候,发现无法获取锁,线程处于什么状态:阻塞
27. 画一下观察者模式的类图并用代码实现
观察者 也叫 发布与订阅
class Student {say()}
class Teacher {
List<Student>
addSdudent(){}
say() {
for(List<Student>){
student.say()
}
}
}
28. dubbo的线程模型是什么?
关注线程创建派发,线程池大小
dispacher:all 所有派发线程池/direct 不派发,在io中执行/...
threadpool:fixed 固定大小/cached 超过1分钟回收线程/limited 一直往上涨,不回收
29.线程之间怎么通讯的?
synchronized/lock
wait/notify
volatile 线程中可见性,每次读写都指向主寸
无volatile
[threadA] [threadB]
get <- 主寸[1] get <- 主寸[1]
set 2 get [1]
set 3 get [1]
set 4 (结束) -> 主寸[4] get [4]
有volatile
[threadA] [threadB]
get <- 主寸[1] get <- 主寸[1]
set 2 -> 主寸[2] get <- 主寸[2]
set 3 -> 主寸[3] get <- 主寸[3]
set 4 (结束) -> 主寸[4] get <- 主寸[4]
30.java8中,stream哪些操作是有状态的,哪些是无状态的,怎么实现并行流的?
??
31.zookeeper分布式锁的加锁的详细流程?
非分布式锁:在一个jvm内的锁,synchronized,lock
分布式锁:使用redis/zookeeper实现跨应用节点的锁(be1/be2锁住同一笔流水)
操作:new RedisLock(key); redisLock.lock(); ->锁住<- redisLock.unlock();
redis实现:setNx(流水key,当前时间+60s);get(判超时);getset(判是否被当前线程写了);del()
zookeeper实现:1.写有序节点:/流水key/有序节点->1/2/3/4/5,2.get节点list,判断当前是否最小,则拿到锁 3.监听watcher比他小的那个值比如[5]监听[4]的消除 4.消除节点
32.说说spring中有哪些设计模式?
单例 bean默认是singoleton
代理模式 aop
...
34.多线程你用过哪些东西?
synchronized/lock
wait/notify/notifyAll
线程池 Excutors.newFixedThreadPool
concurrentHashMap ...
AtomicInteger
36.如果防止用户不停的操作贯穿缓存,直接查询数据库?在代码中怎么实现?
贯穿缓存:一直查询,缓存中不存在的key,直接查数据库
实现:[bank_007:cache][bank_008_not_exist:true],监听insert008场景,删除[bank_008_not_exist]
37.jvm怎么调优
不知道
38.redis分布式锁,怎么实现
见31
39.concurrent并发包下面有哪些类
并发Map,list,set,queue/atomic原子包/lock
41.zookeeper做配置中心,说明原理
目录结构,发布与订阅机制
42.zookeeper怎么保证一致性
paxos算法:部署奇数台,3,5,7台,一起投票,保证一致性
44.spring ioc单例模式,singolton,实现原理
singleton:只有一个实例,单例
prototype:每次请求,新实例
singleton的实现:注册表,Map
Map singletonCache=new HashMap();
singletonCache.put("beanName", new instanse());
singletonCache.get("beanName");
45.synchronize修饰static方法锁对象还是锁类,java内存里,怎么标记锁的?
synchronize修饰非static方法,或者方法局部代码->锁对象
synchronize修饰static方法->锁类
java内存里,怎么标记锁的:java对象头,有标记锁
47.组合模式是啥
class A { a() }
class B { b() }
class C {
A a;
B b;
c() {
a();
b();
...
}
}
48.一个MAP,怎么按照key排序,怎么按照value排序
HashMap无序
按key排序:new TreeMap(hashMap)有序
按value排序:
Map -> List<entry<key,value>> -> Collections.sort(List, new Comparable<entry<key,value>>(){比较value}) -> LinkedHashMap
49.多线程并发修改数据库的一条记录,怎么保证数据安全
乐观锁
悲观锁
50.用户反馈系统慢,怎么排查
定位哪个系统慢:调用链系统比如pinpoint,定位哪个方法慢,往底层方法或者对应系统查找原因
51.某个子系统就是慢,怎么优化
多使用缓存cache,少查数据库
改异步消息消费,实时返回处理中
数据库加索引
读写分离
分库分表
CDN
静态文件压缩,js,css等
图片服务器分离
多部署节点,负载均衡
流量控制
52.怎么设计一个秒杀系统,redis一秒10万并发,怎么设计让系统扛住50万并发
秒杀:分布式锁
redis原子性操作
异步排队
50万并发:部署redis集群,实在扛不住,流控,或者异步消费
53.两个系统数据不一致,怎么排查问题
同步服务日志排查,检查原因
54.怎么做一个报表系统,实时查询符合某些特征的用户交易,涉及大数据jstorm啥的
不知道!
55.linux awk命令,ps -ef,看虚拟机内存命令(输出中有3个参数)
awk 自己查
ps 查进程
top free 自己查
56.怎么实现一个流控功能
方式1:漏桶算法(+)
注解aop,方法进来+1,出去-1,如果值到达阀值,拦掉
方式2:令牌算法(-)
定时1分钟跑批,重置令牌数为100个令牌
注解aop,方法进来-1,如果减为0,拦掉