并发相关知识总结(二)

7 篇文章 0 订阅

前言

二和一之间拖了太久,相信看过这本书的都知道,后半章要真的学透要花很长的时间,看很多的源码,其实后半本我看完也只花了一个月不到,但是看完之后仔细回想一下,发现收货真的不大,于是狠狠的啃了很多源码,包括上班时在项目中使用时,都会特意的去瞧一瞧源码,现在虽不能说吃透,但是我觉得还是有收获把,就一边总结,一边再复习一次。

知识点(第四章)

1、线程

线程定义和什么进程的区别啥的就不总结了,线程包括以下6个状态:

NEW:初始状态;RUNNABLE:运行状态;BLOCKED:阻塞状态;WAITING:等待状态;TIME_WAITING;TERMINATED:终止状态,在前面的linux排查jvm性能中已经提到,通过jstack可以查看线程调用栈以及线程状态。这里需要补(盗)一张特别重要的图:

                

这张图就是书上的原图,这些方法可以控制线程状态的切换,值得注意的是WAITING和TIMED_WAITING,区别就是在切换时调用方法是否带超时参数。

2、Daemon线程

关键点:当JVM中不存在非Daemon(看清楚!是“非”!)线程时,将会退出,通过Thread.setDaemon(true)可以将线程设置为Daemon线程。

3、线程的启动

start方法启动,这里就不多说了,书上也只写了这么点,但这个地方个人觉得有两个特别重要的扩展点,扩展点1:start和run有什么区别,start方法实际上是将线程状态切换至READY状态,然后将线程的控制权交给JVM,去执行run方法,这个过程是异步的,即不需要等待,执行start之后就能往下走了,手动执行run则依然是同步的单线程方式;扩展点2:一个线程可以start两次吗?从1中的图中可以看到,start只能控制线程从NEW->READY,重复调用start会抛状态错误的异常。

4、线程的停止

suspend、resume、stop都已经标记为@Deprecated,相信有过大型一点项目开发经验的人都对stop可能带来的后果有一定的了解,如何安全的中断线程一直是服务端开发的一个关注点,比如微服务的优雅启停,这里可以参考tomcat的做法(hooks)。这里介绍一种使用标志位加中断的方式:

private volatile boolean on = true;
  ...
while(on && !Thread.currentThread().isInterrrupted()) {
  ...
}
public void cancel() {
  on = false;
}

5、线程间通信

  • volatile:之前提过,通过内存失效的方式保证写的可见性;
  • synchronized: 这个就不多说了,保证线程对变量访问的可见性以及排他性;(原理:monitor+对象头)
  • 等待/通知机制:notify/wait,注意:1、notify或者notifyAll调用后,等待线程不会立即返回,要等到调用线程释放锁后才会从wati方法中返回;2、这几个方法都需要先对调用对象加锁,否则会抛异常(IllegalMonitorStateException),这里可以参考monitor的实现机制,因为monitor也是通过线程的状态来实现锁的功能。
  • 管道:这个感觉用的好少,我也没用过,主要用于线程之间的数据传输,传输媒介为内存,包括四种实现:PipedOutputStream、PipedInputStream、PipedReader以及PipedWriter;
  • join:线程挂起,即等待线程结束后再返回,这个也不多说了。
  • ThreadLocal:相信面试经验丰富的人都知道这个有多重要了,虽然书上写的很简单很少,但是个人觉得把ThreadLocal以及InheritedThreadLocal(支持继承的ThreadLocal,即可以将线程的ThreadLocal变量传递给子线程)的源码看一遍还是很有必要的,核心实现原理:ThreadLocalMap,键为ThreadLocal对象,值为变量值;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值