Java

synchronized关键字

自Java 1.0开始,每一个对象都有一个隐式内部锁intrinsic lock ),在Java API Specification中通常被称为监视器monitor )。这个内部锁由synchronized关键字提供支持。synchronized关键字的语义就是“同步的”,这意味着使用这个关键字可以处理共享资源的冲突。

当访问被synchronized关键字保护的方法或代码块时,它将检查锁能否获得——这个锁可以是当前类对象的锁,也可以是一个临时锁( ad-hoc lock ),取决你如何使用,任务执行完成之后会释放锁。

ReentrantLock一样,synchronized关键字获取的锁也是独占锁,并且也是“可重入”的,某个任务可以多次获得对象的锁,并由计数器维护获得锁的次数,当退出一个方法时,计数器-1,完全退出时,才释放锁,这和可重入锁的机制是一样的。

...

HashMap和TreeMap

由于Map的键是Set,因此使用可变对象作为Map的key时,需要覆盖 equalshashCode 方法Map不能使用自身作为key

Java 8对Map接口进行了优化,新增了主要是针对函数式接口默认 方法(方法体被省略):

default V merge (K key, V value,
  BiFunction<? super V, ? super V, ? extends V> remappingFunction) {...}
default V compute (K key,
  BiFunction<? super K, ? super V, ? extends V> remappingFunction) {...}
default V computeIfPresent (K key,
  BiFunction<? super K, ? super V, ? extends V> remappingFunction) {...}
default V computeIfAbsent (K key,
  Function<? super K, ? extends V> mappingFunction) {...}
default V replace (K key, V value) {...}
default boolean replace(K key, V oldValue, V newValue) {...}
default boolean remove (Object key, Object value) {...}
default V putIfAbsent (K key, V value) {...}
default void replaceAll (
  BiFunction<? super K, ? super V, ? extends V> function) {...}
default V getOrDefault (Object key, V defaultValue) {...}

上述方法使用的不多,主要用来对Map键值进行更新,按需查阅API文档。

...

Object超类

在Java中,如果一个类没有明确地指出超类,那么Object就是这个类的超类。实际上,Object类是所有类超类,这个类定义了一些重要的方法。

...

原子性和可见性

原子性一般指原子操作,原子操作不能被线程调度机制中断,一旦操作开始,那么它一定可以在可能发生的上下文切换之前完成。Java语言规范规定了对基本对象(long和double除外)的读写操作是原子的。

不能将原子性和同步划等号!更不能使用原子性来代替同步,当你想使用原子性代替同步写出无锁代码时,思考 Brain Goetz 的建议:

If you can write a high-performance JVM for a modern microprocessor, then you are qualified to think about whether you can avoid synchronizing.

...

LinkedHashMap

LinkedHashMap(链表散列映射)是HashMap的导出类,像LinkedHashSetHashSet的关系一样。

其与HashMap的差别在于其使用LinkedList来维护键值对插入的顺序,其插入机制和HashMap是一致的。

LinkedHashMapHashMap的性能相差不大,与HashSetLinkedHashSet 一致

集合特征
HashMapHashMap基于散列表,插入和查询键值对的开销是固定的
LinkedHashMapHashMap类似,不过其使用LinkedList维护内部次序,因此其迭代顺序是插入顺序或者LRU(最近最少使用)次序,性能稍差于HashMap
...

抽象类与接口

抽象类是由abstract关键字修饰的类。将一个普通类用abstract修饰,它就是抽象类。

若使用abstract修饰方法,那么称该方法为抽象方法,抽象方法没有方法体。

...