多线程
1 . 进程:操作系统中资源分配的最小单位
线程:进程中的独立任务,操作系统中任务调度的最小单位,依赖进程存在
在一个进程中线程共享资源。
2 . java中多线程实现
继承Thread
实现Runnable
实现Callable
线程池 — 推荐
3 . 常用操作方法
sleep():不释放对象锁,立即交出执行权
yield()(让步):交出cpu时间不确定,由系统调度决定,只会让拥有相同优先级的线程获取cpu 的机会,不释放对象锁。
join():线程等待,会释放对象锁
线程停止:
–设置标志位
–调用stop()方法
– 调用interrupt();
wait():
notify():
用户线程与守护线程
4 . 线程的同步与死锁
线程同步:synchronized(内建锁)–对象锁–管程
使用:
同步代码块:synchrinized(对象){//被保护的代码}
同步方法:
–普通方法:锁定当前对象this
public synchronized void test(){}
–静态方法:锁定当前类 .class
如何保护没有关联关系的多个资源? 不同的资源使用不同的锁即可。
保护有关联关系的多个资源 ? 静态
synchronized实现:对象的Monitor机制
可重入锁
JDK1.6之后的优化:
CAS
自适应自旋
偏向锁–默认–在任意时刻只有同一个线程在获取锁
轻量级锁 --在不同时间段有多个线程在获取锁
重量级锁–在同一时刻有多个线程在尝试获取锁
锁粗化:
锁消除:
死锁:共享资源上锁成环(银行家算法)
线程池:
1 . 推荐使用线程池原因:3
2 . 线程池的工作流程
juc包提供的关于并发的工具类
1 . CountDownLatch - 闭锁
public CountDownLatch(int count)
//调用await 方法的线程会一直阻塞
//直到CountDownLatch计数器值减为0才恢复执行
public void await()throw InterruptedException
//减去计数器值的方法
public void countDown()
2 . CyclicBarrier - 循环栅栏
//每个CylicBarrier的对象可以重复使用
//parties:子线程个数
public CyclicBarrier(int parties)
//所有调用await()方法阻塞的子线程在计数器值减为0后,随机挑选一个线程执行barrierAction任务后,所有子线程恢复执行
public CyclicBarrier(int parties,Runnable barrierAction)
//子线程调用await()方法后,将计数器值-1并进入阻塞状态
直到计数器值减为0时,所有调用await()阻塞的子线程再同时恢复执行
public void await()throw InterruptedException
3 . Exchanger - 线程数据交换器
一般用于俩个线程交换数据
首先调用exchange方法的线程会阻塞直到有新的线程进入Exchanger缓冲区,交换彼此线程数据再同时恢复执行
4 . Semaphore - 信号量