jd面试之感
一面问题:问题都回答的很好,顺利进入二面
1. 单点登录的改造和原理
2.hashmap
3.jvm:堆、方法区、栈,本地方法栈,gc,gc 的方式
4.spring 的 ioc、aop 的实现方式 cglib 和 jdk 动态代理
5. 系统中分布式事务处理
6.mybaits 的 #和 $ 区别关于 sql 注入
#相当于对数据 加上 双引号,$ 相当于直接显示数据
1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是 111, 那么解析成 sql 时的值为 order by "111", 如果传入的值是 id,则解析成的 sql 为 order by "id".
2. $ 将传入的数据直接显示生成在 sql 中。如:order by $user_id$,如果传入的值是 111, 那么解析成 sql 时的值为 order by user_id, 如果传入的值是 id,则解析成的 sql 为 order by id 3. #方式能够很大程度防止 sql 注入。
4.$ 方式无法防止 Sql 注入。
5.$ 方式一般用于传入数据库对象,例如传入表名.
6. 一般能用 #的就别用 $.
MyBatis 排序时使用 order by 动态参数时需要注意,用 $ 而不是#
字符串替换
默认情况下,使用 #{} 格式的语法会导致 MyBatis 创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在 SQL 语句中插入一个不改变的字符串。比如,像 ORDER BY,你可以这样来使用:
ORDER BY ${columnName}
这里 MyBatis 不会修改或转义字符串。
重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的 SQL 注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。
7.23 种设计模式 工厂模式、手写单例模式
8. 网络层、物理层、数据链路层、协议层、会话层、应用层、传输层 7 种协议
9.http 为什么是无状态的问题
"无状态":HTTP 协议不具备保存之前发送过的请求或响应的功能
也正是由于“无状态”,可以处理大量的事务,确保了协议的可伸缩性
即使“无状态”,有了 Cookie 再使用 HTTP 协议通信,就可以管理状态了
10.java 多线程中的悲观锁和乐观锁
一:悲观锁
悲观锁,就是不管是否发生多线程冲突,只要存在这种可能,就每次访问都加锁,加锁就会导致锁之间的争夺,有争夺就会有输赢,输者等待。
syncrhoized 是一种独占锁,即:占用该锁的线程才可以执行,申请该锁的线程就只能挂起等待,直到占用锁的线程释放锁才唤醒,拿到锁并执行。由于在进程挂起和恢复执行过程中存在着很大的开销,并且当一个线程正在等待锁时,它不能做任何事。所以 syncrhoized 是一种悲观锁,凡是用 syncrhoized 加了锁的多线程之间都会因锁的争夺结果导致挂起、唤醒等开销。
二:乐观锁
获得锁后一直持有锁以防本线程再次申请该锁造成无谓的解锁再加锁开销,或者假设没有冲突而去完成同步代码块如果冲突再循环重试,或者采取申请锁失败后不立刻挂起而是稍微等待再次尝试获取 等待策略,以减少线程因为挂起、阻塞、唤醒(发生 CPU 的调度切换) 而造成的开销。
偏向锁、轻量级锁(CAS 轮询)、自旋锁 就是基于上述思路的乐观锁。
在多线程的加锁机制中,JVM 会首先尝试乐观锁,失败后才调用悲观锁。
11. 多线程的 callable 和 Future?
http://blog.csdn.net/zhuangxingrui86/article/details/7865677
12.hashmap 和 corruntmap 的区别
13. 怎么优化系统?
缓存、静态化、数据库优化
二面估计是技术老大,针对的是我简历上写的自己的知识扩展,一直加班,没有准备,就没敢瞎扯,没聊到半小时,就结束了,很官方的结束了,唉,还是得多准备
1. 系统中的安全性问题
xss、csrf 攻击、sql 注入、怎么防止 sql 注入,系统中怎么做的
http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html
2.mongdb 和 hbase
3. 数据库的问题,问了我 mysql 是读什么事务数据
数据库特性:原子性、一致性、隔离性、持久性
MySQL 数据库为我们提供的四种隔离级别:
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
MySQL 数据库中,支持上面四种隔离级别,默认的为 Repeatable read (可重复读);
而在 Oracle 数据库中,只支持 Serializable (串行化) 级别和 Read committed (读已提交) 这两种级别,其中默认的为 Read committed 级别。
http://www.cnblogs.com/fjdingsd/p/5273008.html
事务的 7 种传播行为:
PROPAGATION_REQUIRED-- 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS-- 支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY-- 支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW-- 新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED-- 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER-- 以非事务方式执行,如果当前存在事务,则抛出异常。
4.redis 和 memcached 的区别和好处?redis 存储类型?zset 和 list 的区别?
String 、list、set、zset、hash
https://www.cnblogs.com/liangzia/p/5731403.html