Java 线程知识个人汇总

1  线程分类

java中的线程可以分为守护线程(Daemon Thread)和用户线程(User Thread)。用户线程会阻止JVM的正常停止,即JVM正常停止前应用程序中的所有用户线程必须先停止完毕;否则JVM无法停止。而守护线程则不会影响JVM的正常停止,即应用程序中有守护线程在运行也不影响JVM的正常停止。因此,守护线程通常用于执行一些重要性不是很高的任务,例如用于监视其他线程的运行情况。

Java语言中,子线程是否是一个守护线程取决于其父线程:默认情况下父线程是守护线程则子线程也是守护线程,父线程是用户线程则子用户也是用户线程。当然,父线程在创建子线程后,启动子线程之前可以调用Thread实例的setDaemon方法来修改线程的这一属性。

2  进程的状态

  • NEW
  • RUNNABLE
  • BLOCKED
  • WAITING
  • TIMED_WAITING
  • TERMINATED

3  Synchronized   Volatile

   3.1 Synchronized

  • 实现操作的原子性
  • 保证内存的可见性

   3.2 Volatile

  • 保证内存可见性
  • 禁止指令重排序

4 Immutable Object 不可变对象

所谓不可变的对象,即对象一经创建,其对外可见的状态就保持不变。

   4.1 CopyOnWriteArrayList    

 CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。

  1. 减少扩容开销。根据实际需要,初始化CopyOnWriteMap的大小,避免写时CopyOnWriteMap扩容的开销。

  2. 使用批量添加。因为每次添加,容器每次都会进行复制,所以减少添加次数,可以减少容器的复制次数。如使用上面代码里的addBlackList方法。

存在问题:

  • 内存占用问题
  • 数据一致性问题

猜你喜欢

转载自blog.csdn.net/ljcgit/article/details/87357808