1.并发编程三要素
原子性
原子,即一个不可再被分割的颗粒。在Java中原子性指的是一个或多个操作要么全部执行成功要么全部执行失败。
有序性
程序执行的顺序按照代码的先后顺序执行。(处理器可能会对指令进行重排序)
可见性
当多个线程访问同一个变量时,如果其中一个线程对其作了修改,其他线程能立即获取到最新的值。
2. 线程的五大状态
创建状态
当用 new 操作符创建一个线程的时候
就绪状态
调用 start 方法,处于就绪状态的线程并不一定马上就会执行 run 方法,还需要等待CPU的调度
运行状态
CPU 开始调度线程,并开始执行 run 方法
阻塞状态
线程的执行过程中由于一些原因进入阻塞状态
比如:调用 sleep 方法、尝试去得到一个锁等等
死亡状态
run 方法执行完 或者 执行过程中遇到了一个异常
3.悲观锁与乐观锁
悲观锁:每次操作都会加锁,会造成线程阻塞。
乐观锁:每次操作不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止,不会造成线程阻塞。
4.线程之间的协作
4.1 wait/notify/notifyAll
这一组是 Object 类的方法 需要注意的是:这三个方法都必须在同步的范围内调用
wait 阻塞当前线程,直到 notify 或者 notifyAll 来唤醒
notify
只能唤醒一个处于 wait 的线程
notifyAll
唤醒全部处于 wait 的线程
4.2 sleep/yield/join
这一组是 Thread 类的方法
sleep 让当前线程暂停指定时间,只是让出CPU的使用权,并不释放锁
yield 暂停当前线程的执行,也就是当前CPU的使用权,让其他线程有机会执行,不能指定时间。会让当前线程从运行状态转变为就绪状态,此方法在生产环境中很少会使用到,官方在其注释中也有相关的说明
join
等待调用 join 方法的线程执行结束,才执行后面的代码
其调用一定要在 start 方法之后(看源码可知)
使用场景:当父线程需要等待子线程执行结束才执行后面内容或者需要某个子线程的执行结果会用到 join 方法
更多烟台编程相关资讯,请扫描下方二维码