面试笔记

请说明一下sleep() 和 wait() 有什么区别?

答:

1.sleep方法释放cpu资源,没有释放锁,但是wait方法释放cpu资源,释放了锁,使得其他线程可以使用同步控制块
2.sleep可以在任何地方使用,wait notify notifyall只能使用在同步控制块中
3.sleep必须捕获异常,其他不需要
多线程中的i++线程安全吗?请简述一下原因?
答:

语句 i = i++;不是线程安全的。

该语句执行过程如下,

先把 i 的值取出来放到栈顶,可以理解为引入了一个第三方变量 k,此时,k的值为i,

然后执行自增操作,i的值变为1,

最后执行赋值操作 i = k (自增前的值)

因此执行结束后,i的值还是0.

从上面的分析可知,i = i++语句的执行过程有多个操作组成,不是原子操作,因此不是线程安全的。

在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。而java.util.concurrent.AtomicInteger是一个提供原子操作的Integer类,其提供了线程安全且高效的原子操作,是线程安全的。

AtomicInteger类的底层实现原理是利用处理器的CAS操作(Compare And Swap,比较与交换,一种有名的无锁算法)来检测栈中的值是否被其他线程改变,如果被改变则CAS操作失败。这种实现方法在CPU指令级别实现了原子操作,因此,其比使用synchronized来实现同步效率更高。

请你解释HashMap的容量为什么是2的n次幂?

答:为了在计算哈希值的时候可以不用除留余,直接取模运算,只需要做位运算,效率高

请你谈一下面向对象的"六原则一法则"

答:

1、单一职责原则

2、开闭原则

3、依赖倒转原则

4、里氏替换原则

5、接口隔离原则

6、合成聚合复用原则

迪米特法则

请你说明是否可以在static环境中访问非static变量?

答:非静态的变量和方法的调用需要对象的存在,在加载类是,静态代码块,方法优先加载,如果在这调用非静态的,但对象还没创建出来,会报错!

posted @ 2019-02-14 11:27  书酥  阅读(148)  评论(0编辑  收藏  举报