Java 中能创建 volatile 数组吗?
能,Java中可以创建 volatile 类型数组,但是只是一个指向数组的引用,而不是整个数组。如果改变引用指向的数组,将会受到 volatile 的保护,但是如果多个线程同时改变数组的元素,volatile 就不能起到保护 的作用了。
volatile 能使一个非原子操作变成原子操作吗?
Java 中 读取 long 类型变量的操作不是原子的,需要分为两步,如果一个线程正在修改该 long 变量的值,另一个线程只能看到 该值的一半 (前32位),但是对于一个 volatile 类型的 long 或者 double 变量的读写是原子的。
volatile 关键字
- 禁用指令重排序
- 提供 happens-before 保证,确保一个线程的修改能对其它线程是可见的。
某些情况下,提供原子性,读取 long 和 double 类型的值。
java内存dump文件导出与查看
kill -3 PID
- 通过 jmap 来 dump
- 通过 jvisualvm 分析dump文件,或者 Apache mat
ThradLocal
编写多线程程序时的最佳实践
- 给线程命名,方便调试。
- 最小化同步的范围,只对关键部分做同步,而不是整个方法同步。
- 如果可以,更偏向于使用volatile 而不是 synchronized。
- 使用并发工具类,而不是使用 wait() 和 notify() 来实现线程间通信,如 BlockingQueue,CountDownLatch,Semeaphore
- 优先使用并发集合,而不是对集合进行同步。
- 将线程和任务分离,使用线程池执行器来执行 Runnable 或 Callable。
-
Collections 的最佳实践
使用正确的集合类,例如,如果不需要同步列表,使用ArrayList 而不是 Vector。
- 优先使用并发集合,而不是对集合进行同步。
- 使用接口 代表和访问集合,使用 List 存储 ArrayList, Map 存储 HashMap 等等。
- 使用迭代器来循环 集合。
- 使用集合的时候使用泛型。