Java 中能创建 volatile 数组吗?

能,Java中可以创建 volatile 类型数组,但是只是一个指向数组的引用,而不是整个数组。如果改变引用指向的数组,将会受到 volatile 的保护,但是如果多个线程同时改变数组的元素,volatile 就不能起到保护 的作用了。

volatile 能使一个非原子操作变成原子操作吗?

  1. Java 读取 long 类型变量的操作不是原子的,需要分为两步,如果一个线程正在修改该 long 变量的值,另一个线程只能看到 该值的一半 (前32位),但是对于一个 volatile 类型的 long 或者 double 变量的读写是原子的。

volatile 关键字

  1. 禁用指令重排序
  2. 提供 happens-before 保证,确保一个线程的修改能对其它线程是可见的。
  3. 某些情况下,提供原子性,读取 long 和 double 类型的值。

    java内存dump文件导出与查看

  4. kill -3 PID

  5. 通过 jmap 来 dump
  6. 通过 jvisualvm 分析dump文件,或者 Apache mat

ThradLocal

编写多线程程序时的最佳实践

  1. 给线程命名,方便调试。
  2. 最小化同步的范围,只对关键部分做同步,而不是整个方法同步。
  3. 如果可以,更偏向于使用volatile 而不是 synchronized。
  4. 使用并发工具类,而不是使用 wait() 和 notify() 来实现线程间通信,如 BlockingQueue,CountDownLatch,Semeaphore
  5. 优先使用并发集合,而不是对集合进行同步。
  6. 将线程和任务分离,使用线程池执行器来执行 Runnable 或 Callable。
  7. 使用线程池。

    Collections 的最佳实践

  8. 使用正确的集合类,例如,如果不需要同步列表,使用ArrayList 而不是 Vector。

  9. 优先使用并发集合,而不是对集合进行同步。
  10. 使用接口 代表和访问集合,使用 List 存储 ArrayList, Map 存储 HashMap 等等。
  11. 使用迭代器来循环 集合。
  12. 使用集合的时候使用泛型。