![](https://img-blog.csdnimg.cn/20190918135101160.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java并发编程
关于多线程的学习记录
saltedfishust
这个作者很懒,什么都没留下…
展开
-
volatile、synchronized原理与Java内存模型(JMM)
JMMJMM 即 Java Memory Model,它定义了主存、工作内存抽象概念,底层对应着 CPU 寄存器、缓存、硬件内存、 CPU 指令优化等。 其实我们的JAVA程序的执行在内存中是通过一条条指令(编译成字节码)来完成的,而且一行代码往往对应着一到多条指令。JMM 体现在以下几个方面原子性 - 保证指令不会受到线程上下文切换的影响可见性 - 保证指令不会受 cpu 缓存的影响有序性 - 保证指令不会受 cpu 指令并行优化的影响首先需要明确的一点是:这三个特性是针对多线程而言,单个原创 2020-07-15 23:05:00 · 264 阅读 · 0 评论 -
ReentrantLock详解
ReentrantLock简介都支持可重入,相对于 synchronized 它还具备如下特点可中断可以设置超时时间可以设置为公平锁支持多个条件变量(可理解成多个WaitSet)基本语法// 获取锁(也可以放在try里面)// lock 和 unlock 之间代码的都可以看作临界区reentrantLock.lock();try { // 临界区} finally { // 释放锁 reentrantLock.unlock(); }可重入与 syn原创 2020-07-15 23:03:08 · 330 阅读 · 0 评论 -
锁的活跃性——死锁、活锁和饥饿
死锁死锁现象有这样的情况:一个线程需要同时获取多把锁,这时就容易发生死锁 。t1 线程 获得 A对象 锁,接下来想获取 B对象 的锁t2 线程 获得 B对象 锁,接下来想获取 A对象 的锁例:@Slf4j(topic = "c.TestDeadLock")public class TestDeadLock { public static void main(String[] args) { test1(); } private static voi原创 2020-07-15 23:01:48 · 239 阅读 · 0 评论 -
park & unpark
基本使用park 和 unpark 是 LockSupport 类中的方法// 暂停当前线程 LockSupport.park();// 恢复某个线程的运行LockSupport.unpark(暂停线程对象);park&unpark 与 wait¬ify 异同park和wait都会让线程进入WAITING或TIMED_WAITING状态;wait、notify 和 notifyAll 必须配合 Object Monitor 一起使用;而 park、unpark 不必原创 2020-07-15 22:58:49 · 390 阅读 · 0 评论 -
深入解析join源码和保护性暂停模式
join源码解析和保护性暂停模式join(long millis):等待被join的线程的时间最长为millis毫秒。如果在millis毫秒内被join的线程还没有执行结束,则不再等待。源码如下:// wait方法必须在synchronized块里使用,然后让加锁的对象调用wait方法public final synchronized void join(long millis)throws InterruptedException { long base = System.current原创 2020-07-09 23:05:31 · 580 阅读 · 0 评论 -
Thread类里的线程状态和操作系统层面的线程状态
五种状态这是从操作系统层面来描述的。操作系统层面--线程的生命周期(五种状态)-中文操作系统层面--线程的生命周期(五种状态)-英文新建状态:仅是在语言层面创建了线程对象,还未与操作系统线程关联可运行状态(就绪状态):指该线程已经被创建(与操作系统线程关联),可以由 CPU 调度执行运行状态:指获取了 CPU 时间片运行中的状态 当 CPU 时间片用完,会从运行状态转换至可运行状态,会导致线程的上下文切换阻塞状态:如果调用了阻塞 API,如 BIO 读写文件,这时该线程实际不会用到 CP原创 2020-06-30 18:12:23 · 361 阅读 · 0 评论 -
Thread类方法之三--setDaemon
主线程与守护线程默认情况下,Java 进程需要等待所有线程都运行结束,才会结束。有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束。Thread有一个setDeamon方法,将当前线程设置为守护线程,其中daemon是一个boolean值,通过源码我们发现,他会先通过isAlive方法判断线程的状态。简单介绍一下isAlive方法:判断当前的线程是否处于活动状态。活动状态是指线程已经启动且尚未终止,线程处于正在运行(Running)或就绪(R原创 2020-06-30 17:21:12 · 319 阅读 · 0 评论 -
Thread类方法之二--interrupt
interrupt 方法打断线程case1:打断sleep, wait, join (阻塞)的线程case2:打断运行中的线程打断阻塞状态中的线程,会抛出一个InterruptedException异常,并且会重置打断标记。介绍一下打断标记Thread类里有一个isInterrupted方法可以返回当前线程是否被打断,被打断返回true,否则false。public boolean isInterrupted() { return isInterrupted(false)原创 2020-06-30 00:48:31 · 3814 阅读 · 0 评论 -
Thread类的方法之一--start、run、sleep、yield、join
Thread类的sleep(),yield(),join()方法,以及Object类的wait()方法好像都有暂停线程的意思,区别是什么,怎么用?原创 2020-05-10 19:51:55 · 561 阅读 · 0 评论