java面试笔记

一、Synchronized关键字和Lock的区别
1、Synchronized关键字不会造成死锁(出现异常释放锁),而Lock可能会造成死锁。
2、Lock可以让等待锁的线程响应中断,Synchronized不行。
3、通过Lock可以知道是否获取锁成功,而Synchronized不行。
4、Lock可以提高多个线程读的效率(读写锁)。
5、性能上,竞争不激烈,两者差不多;竞争非常激烈,Lock性能远大于Synchronized。
二、Redis

雪崩:
1、使用信号量semaphore控制并发数量
2、缓存降级
击穿:
1、设置白名单–布隆过滤器
2、参数校验–正则
3、如果数据库没有这个热点数据,在redis设置一个空值或者特殊值,并设置一个有效时间,防止短时间内不断查询数据库。
持久化方式:
1、RDB。是一种快照存储方式,就是将redis某一时刻的内存数据保存到硬盘文件中,dump.rdb。redis重启时会加载dump.rdb文件的数据到内存中恢复数据。可在redis.conf文件中做如下配置:

# 900s内至少达到一条写命令
save 900 1
# 300s内至少达至10条写命令
save 300 10
# 60s内至少达到10000条写命令
save 60 10000

使用这种法师当达到触发条件时,会forks一个子进程进行数据同步,这种方式的问题是:触发时间太短,频繁写入影响服务器性能;时间太长则会早成数据丢失。但是与AOF相比,文件恢复数据比较快。
2、 AOF。保存每次客户端对服务器的写操作,当redis重启时会加载并运行aof文件的命令,来恢复数据。同样可以在配置文件中配置:

# 开启aof机制
appendonly yes

# aof文件名
appendfilename "appendonly.aof"

# 写入策略,always表示每个写操作都保存到aof文件中,也可以是everysec或no
appendfsync always

# 默认不重写aof文件
no-appendfsync-on-rewrite no

# 保存目录

配置always会记录每一个写请求,倒是性能降低;everysec每秒一次,可能丢失一秒的数据;no,是redis不负责写入aof,有操作系统来处理什么时候写入,更快,但是也是最不安全的。

为什么redis是单线程,却能支持高并发?
这里的单线程指的是客户端与服务端网络连接部分
1、基于内存的操作,读写速度很快。
2、因为是单线程,省去了上下文切换线程的时间;并且不用考虑锁的问题,省去了加锁的性能消耗。
3、redis使用了IO多路复用技术。多路-指的是多个网络连接,复用-指的是复用一个线程。多路复用主要有:select、poll、epoll等。epoll是最新也是目前最好的多路复用技术。
4、内部数据结构简单(动态决定),读取速度快

三、HashMap

1、HashMap转红黑树两个条件,一个链表长度大于等于8,二是数组长度到64,小于64只扩容,大于才转红黑树。
2、HashMap为什么扩容是2倍。因为在计算元素位置的时候使用的是(length-1)&hash,也就是数组长度-1和hash做与运算,length是2的倍数,(length-1)转成二进制所有位都为1,在做与运算,最后位可能为1也可能为0,保证均匀分布。位运算速度快。
3、为什么加载因子是0.75。因为元素在hash桶中出现的频率服从泊松分布(是单位时间内独立事件发生次数的概率分布),当加载因子为0.75的时候,链表长度超过8的概率为百万分之一。
4、hashcode的算法

static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

h >>> 16是用来取出h的高16,(>>>是无符号右移)
^ : 位异或 第一个操作数的的第n位于第二个操作数的第n位相反,那么结果的第n为也为1,否则为0
h和自己的高16位异或,结果的高16位不变,低16位和高16位异或,可以将高低位二进制特征混合起来。因为上面说的计算槽位的时候,是(length-1)&hash,而通常我们的hashmap大小不会大于2的16次方(65536),那么在计算槽位时会丢失高16位的二进制特征,所以计算hashcode的时候,高16位和低16位异或为了分散均匀。

四、Spring

1、ApplicationEvent与ApplicationListener的使用(事件监听,横向扩展功能,观察者模式
创建一个类实现ApplicationEvent

@Compone
public class OrderEvent implement ApplicationEvent{
public OrderEvent(Object source){
super(source);
}
}

创建一个监听类实现ApplicationListener,如果关心监听类的执行顺序,可以使用SmartApplicationListener

public class WxListener implement ApplicationListener<OrerEvent>{
       @Override
       public void onApplicationEvent(OrderEvent orderEvent){
       System.out.println("发送微信");
}
}

主体功能类

@Service
public class OrderService{
@autowire
ApplicationContext applicationContext;

public void saveOrder(){

OrderEvent orderEvent = new OrderEvent("参数");
//发布事件
applicationContext.publishEvent(orderEvnet);
}
}
五、BIO、NIO

1、所谓BIO就是阻塞IO,像传统的socket编程,会造成线程资源浪费(等数据的过程中空闲)

ServerSocket socket = new ServerSocket("8080");
//向操作系统获取一个连接,如果没有连接可以获取,就会阻塞
Socket connection = socket.accept();
byte request = new byte[1024];
//读取数据,处理数据,如果没有数据 会阻塞
connection.inputStream.read(request);
 System.out.println(new String(request));

2、NIO又叫New IO,非阻塞IO

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configuraBlocking(false);//配置为非阻塞模式
serverSocketChannel .bind(new InetSocketAddress(8080));
 System.out.println("NIO 启动");
//底层操作系统-多路复用
Selector selector= Selector.oper();
 //获取新连接
 SocketChannel newConnection = serverSocketChannel.accept();//非阻塞,可能返回null
 if(newConnection ==null){
 continue;
 }
 newConnection.configuraBlocking(false);//配置为非阻塞模式
 //让selector去监听,当有数据传输过来的时候,再去处理
newConnection.register(selector,SelectionKey.OP_READ);
selector.select();
Set<SelectionKey> eventKey = selector.selectedKeys();
Iterator<SelectionKey> iterator = eventKeys.iterator();
while(iterator.hasNext()){
SelectionKey event = iterator.next();
if(event.isReadable()){
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
newConnection.read(byteBuffer);
byteBuffer.flip();//转为读模式
System.out.println(new String(byteBuffer.array()));
}
}

六、分布式事务

1、XA规范
一套规范、接口,定义交易中间件与数据库之间的接口规范,WebLogic、WebShare提供了JTA的实现,tomcat没有,需要借助第三方工具如:Jotm,Automikos。
2、两阶段提交
try、confirm、cancel,准备阶段与提交(回滚)阶段。

七、ConcurrentHashMap

jdk1.7中是采用Segment + HashEntry + ReentrantLock的方式进行实现的,而1.8中放弃了Segment臃肿的设计,取而代之的是采用Node + CAS + Synchronized来保证并发安全进行实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值