1、锁可以锁在哪里?
Java为程序加锁的方式主要有两种方式:synchronized与 Lock。
1.synchronized 可以修饰的作用域如下:
- 非静态方法(加的锁为对象锁)
- 静态方法(加的锁为对象锁)
- 代码块(对象锁与类锁均可)
2.Lock采用Lock()对代码加锁,unlock()进行解锁
2、怎么利用反射获取类中的对象?
1.获取Class对象
2.通过Class对象获取构造方法
3.通过构造方法调用newInstance()方法创建对象实例
3、HTTP和https区别?
1、HTTP明文传输,数据都是未加密的,安全性较差,HTTTPS(SSL+HTTP)数据传输过程是加密的,安全性较好。
2、使用HTTPS 协议需要CA(Certficate Authority,数字证书认证机构)申请证书,一般免费证书比较少,因此需要一定的费用
3、HTTP页面响应速度比HTTPS快,主要是因为HTTP使用TCP三次握手建立连接,客户端和服务器需要交换3个包,而HTTPS除了TCP的三个包,还要加上SSL握手需要9个包所以一共是12个包
4、http和https使用的是完全不同的是完全不同的链接方式,用的端口也是不一样前者是80 后者是443
5、HTTPS其实就是建构在SSL/TLS之上的HTTP协议,所以要比较HTTPS与HTTP要更消耗服务器资源
4 、谈谈你对TCP/IP 协议的了解
1、TCP/IP是一个协议簇,是一个开放的协议标准,所有人都可以免费使用,并且是独立于硬件的操作系统
2、TCP/IP协议是不区分网络硬件的,它在局域网、广域网和互联网中都被广泛使用
3、TCP/IP协议使用统一的网络地址分配的方案,网络中的每台电脑都具有唯一的IP地址
4、TCP/IP协议是一个标准的高层协议,拥有极高的可靠性,可以为用户提供可靠的服务
5、说说AOP和IOC的应用
IOC的主要应用场景体现在BeanFactory接口,BeanFactory下面有具体的实现类来实现IOC的功能
AOP的主要应用场景:日志、权限、事务等
6、Spring中bean是线程安全的吗?
Spring容器中的Bean本身不具备线程安全得特性,但是具体还是要结合具体scope的Bean去研究
1、Spring容器中的Bean默认是单例的,所有线程都是共享一个单例的Bean,因此是存在资源竞争的。如果单例Bean,是一个无状态Bean,也就是线程中的操作不会对Bean的成员执行查询以外的操作,那么这个单例Bean是线程安全的,比如SpringMVC 的controller、server、DAO 等,这些bean大多数是无状态的 只关注于方法本身。对于有状态的bean 是线程不安全的 但是我们可以通过TreadLocal去解决线程安全的方法
2、对于原型Bean(即scope=“prototype”),每次创建一个新对象,也就是线程之间并不存在Bean共享 自然是不会有线程安全的问题
7、Maven中package和install区别
package是把jar打到本地项目的target下,而install是把target下的jar安装到本地仓库
,供其他项目使用
8、谈谈简单工厂和抽象工厂的区别
简单工厂模式:是由一个工厂对象创建产品实例,简单工厂模式的工厂类一般是使用静态方法,通过不同的参数的创建不同的对象实例 可以生产结构中的任意产品 ,不能增加新的产品、
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需制定他们具体类 生产多个系列产品 生产不同产品族的全部产品,不能新增产品可以新增产品族
9、说说你常用的linux基本操作命令
ls - 用来显示目标列表
cd - 用来切换工作目录
pwd - 以绝对路径的方式显示用户当前工作目录
cat - 文件内容查看
grep - 是一种强大的文件搜索工具,他能使用正则表达式搜索文本,并并把匹配的行打印出来
tail - 输出文件中的尾部内容
ps - 用于报告当前系统的进程状态
kill - 命令用来删除执行中的程序或工作
top - 可以实时动态的查看系统的整体运行情况
10、谈谈Currenthashmap的扩容机制
JDK1.7:
先对数组的长度增加一倍,然后遍历原来的旧的table数组,把每一个数组元素也就是Node链表迁移到新的数组里面,最后迁移完毕之后 把数组的引用直接替换旧的
JDK1.8:
扩容时候会判断这个值,如果超过阈值就要扩容,首先根据运算得到需要遍历的次数i,然后利用 tabAt 方法获得 i 位置的元素 f,初始化一个 forwardNode 实例 fwd, 如果 f == null,则在 table 中的 i 位置放入 fwd,否则采用头插法的方式把当前旧 table 数组的指定任务范围的数据给迁移到新的数组中,然后 给旧 table 原位置赋值 fwd。直到遍历过所有的节点以后就完成了复制工作,把 table 指向 nextTable,并 更新 sizeCtl 为新数组大小的 0.75 倍 ,扩容完成。在此期间如果其他线程的有读写 操作都会判断 head 节点是否为 forwardNode节点,如果是就是帮助扩容。