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 Lock
public interface Lock {
void lock();
void lockInterruptibly() throws InterruptedException;
boolean tryLock();
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
void unlock();
Condition newCondition();
}
- void lockInterruptibly() throws InterruptedException;
该方法在线程调用过interrupt()方法后中断进程
interrupt()不能中断在运行中的线程,它只能改变中断状态而已。
4.1 ReentrantLock
4.2 ReentrantReadWriteLock
实现了接口ReadWriteLock接口
public interface ReadWriteLock {
Lock readLock();
Lock writeLock();
}
5 Immutable Object 不可变对象
所谓不可变的对象,即对象一经创建,其对外可见的状态就保持不变。
5.1 CopyOnWriteArrayList
CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。
1. 减少扩容开销。根据实际需要,初始化CopyOnWriteMap的大小,避免写时CopyOnWriteMap扩容的开销。
2. 使用批量添加。因为每次添加,容器每次都会进行复制,所以减少添加次数,可以减少容器的复制次数。如使用上面代码里的addBlackList方法。
存在问题:
- 内存占用问题
- 数据一致性问题