java 面试题(2)

1 static 2HashMap 3wait()和sleep 4volatile

1 static 使用案例

https://blog.csdn.net/qq_27053103/article/details/79564062

https://github.com/francistao/LearningNotes/blob/master/Part1/Android/ANR%E9%97%AE%E9%A2%98.md

https://www.jianshu.com/p/ce6da05c93fe

pulbic class Something{  

public synchronized void isSyncA(){}  

public synchronized void isSyncB(){}  

public static synchronized void cSyncA(){}  

public static synchronized void cSyncB(){}  

}  

 那么,假如有Something类的两个实例x与y,那么下列各组方法被多线程同时访问的情况是怎样的?

a. x.isSyncA()与x.isSyncB()   (x 都是对同一个实例(x)的synchronized域访问,因此不能被同时访问)

b. x.isSyncA()与y.isSyncA()     ( √ 是针对不同实例的,因此可以同时被访问)

c. x.cSyncA()与y.cSyncB() (×因为是static synchronized,所以不同实例之间仍然会被限制,相当于Something.isSyncA()与 Something.isSyncB)

d. x.isSyncA()与Something.cSyncA() (√ synchronzied的是实例方法与synchronzied的类方法由于锁定(lock)不同的原因)

参考


java 面试题(2)_第1张图片

https://blog.csdn.net/cs408/article/details/48930803


2  HashMap

HashMap的主干是一个Entry数组。Entry是HashMap的基本组成单元,每一个Entry包含一个key-value键值对。

HashMap和Hashtable区别?

1.HashMap支持null Key和null Value;Hashtable不允许。这是因为HashMap对null进行了特殊处理,将null的hashCode值定为了0,从而将其存放在哈希表的第0个bucket。

2.HashMap是非线程安全,HashMap实现线程安全方法为Map map = Collections.synchronziedMap(new HashMap());Hashtable是线程安全

3.ArrayList和LinkedList对比

ArrayList和Vector使用了数组的实现,可以认为ArrayList或者Vector封装了对内部数组的操作,比如向数组中添加,删除,插入新的元素或者数据的扩展和重定向。

LinkedList使用了循环双向链表数据结构。与基于数组ArrayList相比,这是两种截然不同的实现技术,这也决定了它们将适用于完全不同的工作场景。

3wait()和sleep()的区别。

① 这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。

② 锁: 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

③ 使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。

   synchronized(x){       

        x.notify() //或者wait()  

  }

4. volatile原理与线程同步的方法:sychronized、lock、reentrantLock等

你可能感兴趣的:(java 面试题(2))