甘肃中工国际
甘肃中工国际
面试流程
技术初面 -> 技术总监面->hr面
技术初面
学习Java的方法
学习Java过程中有没有什么比较难的点
Stream流有没有用过,一些常用的方法?
中间操作: Filter(过滤) Map(转换) Sorted(排序) Distinct(去重) Limit(限制) Skip(跳过) Peek(展示)
终止操作: forEach(循环) Collect(收集) Count(计数) Reduce(聚合) AnyMatch(任意匹配) AllMatch(全部匹配) NoneMatch(无匹配)
多线程有用过吗
如何保证共享数据的安全性
Synchronized和Lock的区别(没答上)
1、两者所处层面不同 synchronized是Java中的一个关键字,当我们调用它时会从在虚拟机指令层面加锁,关键字为monitorenter和monitorexit Lock是Java中的一个接口,它有许多的实现类来为它提供各种功能,加锁的关键代码为大体为Lock和unLock; 2、获锁方式 synchronized可对实例方法、静态方法和代码块加锁,相对应的,加锁前需要获得实例对象的锁或类对象的锁或指定对象的锁。说到底就是要先获得对象的监视器(即对象的锁)然后才能够进行相关操作。 Lock的使用离不开它的实现类AQS,而它的加锁并不是针对对象的,而是针对当前线程的,并且AQS中有一个原子类state来进行加锁次数的计数 3、获锁失败 使用关键字synchronized加锁的程序中,获锁失败的对象会被加入到一个虚拟的等待队列中被阻塞,直到锁被释放;1.6以后加入了自旋操作 使用Lock加锁的程序中,获锁失败的线程会被自动加入到AQS的等待队列中进行自旋,自旋的同时再尝试去获取锁,等到自旋到一定次数并且获锁操作未成功,线程就会被阻塞 4、偏向或重入 synchronized中叫做偏向锁 当线程访问同步块时,会使用 CAS 将线程 ID 更新到锁对象的 Mark Word 中,如果更新成功则获得偏向锁,并且之后每次进入这个对象锁相关的同步块时都不需要再次获取锁了。 Lock中叫做重入锁 AQS的实现类ReentrantLock实现了重入的机制,即若线程a已经获得了锁,a再次请求锁时则会判断a是否持正有锁,然后会将原子值state+1来实现重入的计数操作 5、Lock独有的队列 condition队列是AQS中的一个Lock的子接口的内部现类,它一般会和ReentrantLock一起使用来满足除了加锁和解锁以外的一些附加条件,比如对线程的分组和临界数量的判断(阻塞队列) 6、解锁操作 synchronized:不能指定解锁操作,执行完代码块的对象会自动释放锁 Lock:可调用ulock方法去释放锁比synchronized更灵活
说一下Redis的用途
1.全页面缓存
整页缓存。如果你正在使用服务器端呈现的内容,则不需要为每个单独的请求重新渲染每个页面。使用如Redis这样的缓存,你可以缓存经常请求的内容,从而大大减少请求最多的页面的延迟,并且大多数框架针对Redis缓存页面都有hooks。
// 设置全页面缓存1分钟
SET key "<html>...</html>
2.顺序排列
由于Redis在内存中Set数据结构可以非常快速和高效进行递增和递减,性能远远高于SQL查询。比较这与Redis的排序集相结合意味着你可以以毫秒为单位抓取列表中评分最高的项目,而且实现起来非常容易。
// 向排序集合中添加值
ZADD sortedSet 1 "one"
// 从排序集合中获取所有值
ZRANGE sortedSet 0 -1
// 从排序集合中获取所有值与权重
ZRANGE sortedSet 0 -1 WITHSCORES
3.会话Session存储
我所见的Redis最常见的用途是会话存储。与其他会话存储(如Memcache)不同,Redis可以保留数据,以便在缓存停止的情况下,在重新启动时,所有数据仍然存在。即便不是需要严格持续的任务,此功能仍可以为你的用户省去大量的麻烦。没有人会乐于见到他们的会话被无缘无故随机删掉。
// 设置一分钟过期的session
SET randomHash "{userId}" EX 60
// 获取用户ID
GET randomHash
4.队列
使用Redis可以做的一个不太常见,但非常有用的事情是排队。无论是电子邮件队列还是其他应用程序使用的数据,你都可以在Redis中创建一个高效的队列。任何熟悉堆栈以及会push和pop项目的开发人员都可以轻松自然地使用此功能。
// 添加消息
HSET messages <id> <message>
ZADD due <due_timestamp> <id>
// 接收消息
ZRANGEBYSCORE due -inf <current_timestamp> LIMIT 0 1
HGET messages <message_id>
// 删除消息
ZREM due <message_id>
HDEL messages <message_id>
5.pub/sub
Redis在真实世界的最终用法即我将在这篇文章中提出的pub / sub。这是Redis内置的最强大的功能之一;得到的可能是无限的。你可以创建一个实时聊天系统,在社交网络上触发好友请求的通知等等。这个功能是Redis提供的最被低估的功能之一,但功能非常强大,而且使用简单。
// 向通道中推送消息
PUBLISH channel message
// 从通道中获取消息
SUBSCRIBE channel
数据库和缓存的一致性
讲一下抽奖项目的分段消费和加锁确保数据安全
讲一下工作项目的索引优化和分页查询优化
常用的数据结构(没答上)
顺序表(数组 Array)
链表
栈(Stack)
队列(Queue)
树(Tree)
堆(Heap)其实是完全二叉树
图(graph)
散列表(Hash)