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)不同的原因)
参考
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()
}