导图社区 java多线程
java多线程学习笔记,设计线程创建,线程同步,线程池,信号量等。
提示: 本内容由社区用户上传并分享。平台不对内容的真实性、合法性、知识产权归属及是否侵害第三方权利进行事前审核或保证。本内容可能包含受版权保护的图片、字体或其他第三方素材,使用前请自行确认授权范围。
社区模板帮助中心,点此进入>>
论语孔子简单思维导图
《傅雷家书》思维导图
《童年》读书笔记
《茶馆》思维导图
《朝花夕拾》篇目思维导图
《昆虫记》思维导图
《安徒生童话》思维导图
《鲁滨逊漂流记》读书笔记
《这样读书就够了》读书笔记
妈妈必读:一张0-1岁孩子认知发展的精确时间表
java多线程
分布式线程锁
数据库
redis
zookeeper
放到别的主题说,太长了。。。
线程定义
继承Thread类
单继承
实现Runnable接口
可继承多个接口
实现Callable接口
有返回值,可抛出异常
FutureTask
实现Future,Runnable接口
使用get方法获取返回值,会阻塞线程
常用语句
new Thread(()->{}).start()
新建并启动一个线程
object.wait()
当前运行的持有object锁的线程让出cpu时间片,线程处于等待(阻塞)状态
t.join()
等待t线程执行完成在继续执行
object.notify()
随机唤醒一个等待object锁的所有线程中的一个,使其重新加入锁竞争,使线程处于就绪状态
object.notifyAll()
Thread.sleep()
线程处于等待状态,但是仍然持有锁
线程状态
新建
new 一个线程
可运行
调用了start状态,但是cpu还没转让给这个线程
运行
运行状态
阻塞
让出cpu使用权,等待执行,如调用了wait方法
死亡
线程执行结束或者异常退出
ConcurrentHashMap
segment(jdk1.7)
CAS+synchronize(jdk1.8)
锁消除
锁消除即删除不必要的加锁操作。根据代码逃逸技术,如果判断到一段代码中,堆上的数据不会逃逸出当前线程,那么可以认为这段代码是线程安全的,不必要加锁
线程池
Executors
newFixedThreadPool
核心线程数量等于最大线程数量,使用无界队列
newSingleThreadExecutor
单线程线程池
newScheduledThreadPool
执行延时或者周期性任务
newCachedThreadPool
核心线程数为0,最大线程数为Integer最大值
核心线程数
最大线程数
等待时间
队列类型
时间单位
线程饱和策略handler
CallerRunsPolicy
请求脱离线程池运行
AbortPolicy
默认:终止策略,抛出RejectedExecutionException异常
DiscardPolicy
丢弃这个任务
DiscardOldestPolicy
将阻塞队列中等待时间最久的任务删除(即队列头部的任务),将新的任务加入队尾
核心方法
execute()
提交任务,无返回值
submit
提交任务,有返回值
ForkJoinPool
JDK7引入
RecursiveTask相当于callable
有返回值
RecursiveAction相当于runnable
无返回值
compute()相当于run()
forkjoin核心方法,任务的拆分
fork()
开启一个新线程,将任务交给新线程处理
join()
获取线程返回值
invoke()和submit()
parallelStream
jdk8新特性,并行流
线程同步
synchronized 关键字
特性
可重入
检查当前获得锁的线程是不是当前线程,如果是
非公平
执行结束或者异常自动释放锁
互斥
使用方式
修饰代码块,括号里的对象(当前实例,类对象,任意对象)
静态方法,锁当前类对象
普通方法,锁当前实例对象(方法调用者)
实现:对象头锁标志位,获得锁+1,释放锁-1?
锁的种类
JDK1.6之后引入偏向锁和轻量级锁的概念
偏向锁
直接修改markdown记录获得
偏向锁升级轻量级锁
t2尝试获取偏向锁,此时对象头指向的不是自己(指向t1,而不是t2),开始撤销偏向锁, 升级为轻量级锁,偏向锁的撤销,需要等待全局安全点,然后检查持有偏向锁的线程(t1)是否活着如果存活:让该线程(t1)获取轻量级锁,将对象头中的Mark Word替换为指向锁记录的指针,然后唤醒被暂停的线程。 也就是说将当前锁升级为轻量级锁,并且让之前持有偏向锁的线程(t1)继续持有轻量级锁如果已经死亡:将对象头设置成无锁状态
轻量级锁
自旋等待获得
重量级锁
objectMonitor
阻塞等待其他线程唤醒后尝试获得锁
Lock锁
自旋锁
ReentrantLock(可重入锁)
ReadWriteLock
读锁
共享锁
写锁
独享锁
可指定是公平锁还是非公平锁
继承AbstractQueuedSynchronizer(AQS)
condition
await()
signal()
signaAlll()
CAS获取锁,失败重新获取,失败加入等待队列自旋等待
CountDownLatch
jdk1.5引入
内部维护计数器
被await()阻塞的线程,等待countdownlatch计数器清零后继续执行
countDow()
使计数器减一,报告自己已完成任务
栅栏(CyclicBarrier)
await()
Semaphore
acquire()
阻塞,可中断
acquierUninterruptibly()
阻塞,不可中断
tryAcquire()
非阻塞,只尝试获取一次,成功true,失败false
release()
释放许可证
允许多个线程同时进入临界区
volatile和ThreadLocal
valatile
所有线程可见,在写的状态,使其他线程副本失效,强制从主内存读取数据
ThreadLocal
每个线程保存一个ThreadLocalMap.ThreadLocal作用本地变量基本一样