线程状态
Runnable
可运行状态(执行start()方法,CPU决定是否运行)
Waiting
等待、计时等待(等待某些条件成熟)
线程操作
sleep
sleep()是线程Thread的方法
sleep()不会释放对象锁
sleep()可以在任何地方调用
wait
wait()是Object对象的方法
wait()会释放对象锁
wait()方法之可以在同步方法或同步块中使用
notify
notify() 唤醒一个线程(谨慎使用),具体唤醒哪个线程,由CPU决定
notifyAll
notifyAll() 所有在对象O上wait的线程全部唤醒(应用较多)
线程停止
1、run方法代码执行完成
2、线程运行时抛出一个未捕获的异常,跳出线程
3、通过标志位跳出线程
4、interrupt() 向需要中断的线程发送停止指令;isInterrupted() 线程检查自己的中断标志位;Thread.interrupted() 将中断标志位复位为false;
不安全方式
Stop() 立刻停止线程,但不会释放线程运行所应用的资源
Suspend() 立刻挂起线程,但不会释放线程运行锁应用的资源,容易造成死锁
volatile<br>
在多个线程之间,访问同一个被volatile修饰的对象时,所有线程共享这个对象的值
但是volatile不是线程安全的(多个线程同时修改这个变量时,最终结果不一定是最后修改的那个值;可以保证线程的可见性,不可以保证操作的原子性)
synchronized
可以修饰方法或代码块以同步的方式执行(同一时间只会有一个线程执行)
加锁,放到静态方法上是类锁,放到非静态方法上是对象锁
类锁与实例锁本质上是两把锁,类锁锁的是每一个类的class对象
代码块执行完或线程抛出异常时结束线程
修饰的锁其他线程在等待获取锁的阶段,会一直阻塞等待直到得到锁为止(不可中断锁)
无法判断锁的状态
synchronized是非公平锁
lock
Lock是一个接口
Lock必须显示调用释放锁的方法:unlock()
Lock有多种方式可以获取锁,不一定一直阻塞等待(可中断锁)
Lock可以判断锁状态
Lock可以设置为公平锁
公平锁
公平锁,先对锁发出获取请求的一定先获得锁。非公平锁则反之(性能更高)ReentrantLock(boolean)可选择公平锁或非公平锁,默认使用非公平锁。
锁的可重入
synchronized隐式支持锁的重入
ReentrantLock的lock()支持锁的重入
读写锁
同一时刻运行多个读线程访问,但是只允许一个写线程,写锁会阻塞所有锁(ReentrantReadWriteLock)
Condition
Condition接口与Lock配合,来实现等待通知机制
线程安全
当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的
死锁
当一个锁未被释放,其他线程无法获取锁的时候,程序产生死锁情况
线程thread1先获取锁locka,然后在同步块里嵌套竞争锁lockb。而线程thread2先获取锁lockb,然后在同步块里嵌套竞争锁locka
Lock.unlock()方法的错误使用,导致死锁
线程池
用于管理线程的一个工具。
线程池的作用?限制系统中执行线程的数量;降低资源的消耗、提高响应速度、提高线程的可管理性。
常见线程池
Executors.newSingleThreadExecutor:单个线程的线程池;
Executors.newFixedThreadExecutor:固定线程数量的线程池;
Executors.newCacheThreadExecutor:可缓存线程;
Executors.newScheduledThreadPool:创建一个定长线程池,支持定时和周期性的执行线程;
常用的并发工具类
闭锁:CountDownLatch
CountDownLatch 闭锁允许一个线程或多个线程等待特定情况,同步完成线程中其他任务。
栅栏:CyclicBarrier
CyclicBarrier和CountDownLatch都可以协同多个线程,让指定数量的线程等待期他所有的线程都满足某些条件之后才继续执行。CyclicBarrier可以重复使用(reset)
构造方法CyclicBarrier(int, Runnable) 所有线程达到屏障后,执行Runnable
信号量:Semaphore
用来控制同时访问特定资源的线程数量
交换者:Exchanger
Exchanger 交换者用于在两个线程之间传输数据,被调用后等待另一个线程达到交换点,然后相互交互数据
常用的并发容器
ConcurrentHashMap:JDK1.7实现:分段锁;JDK1.8实现:元素(key)锁+链表+红黑树
SkipList:跳表自动随机维护一套索引,用于高效的索引List中的有序数据
ConcurrentSkipListMap:TreeMap的并发实现
ConcurrentSkipListSet:TreeSet的并发实现
ConcurrentLinkedQueue:LinkedList的并发实现
CopyOnWriteArrayList:写时复制,在添加元素是,复制一个新的容器,在新容器中新增元素;读数据都在Old容器中操作,进行读写分离。数据一致性较弱,适合读多写少的场景
CopyOnWriteArraySet:同上