![](https://img-blog.csdnimg.cn/3375930fb95e422da2979b71acc82150.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
JUC并发编程
并发编程笔记
妙先森
这个作者很懒,什么都没留下…
展开
-
Java中的活锁
活锁出现在两个线程互相改变对方的结束条件,最后谁也无法结束,例如public class TestLiveLock { static volatile int count = 10; static final Object lock = new Object(); public static void main(String[] args) { new Thread(() -> { // 期望减到 0 退出循环 while (count > 0) {原创 2022-05-23 15:53:17 · 721 阅读 · 1 评论 -
使用jps和jstack命令定位死锁
衔接Java中的死锁分析先使用jps找出检查的java进程再使用jstack分析进程里的线程jstack 进程id输出的打印信息里有提示死锁发生在哪个线程还有死锁等待的代码在哪行的信息原创 2022-05-23 14:47:38 · 148 阅读 · 0 评论 -
Java中的死锁
一个线程需要同时获取多把锁,这时就容易发生死锁t1 线程 获得lockA对象锁,接下来想获取lockB对象 的锁 t2 线程 获得lockB对象 锁,接下来想获取 lockA对象 的锁例:@Slf4jpublic class TestDealLock { public static void main(String[] args) { Object lockA = new Object(); Object lockB = new Object();原创 2022-05-23 14:20:12 · 319 阅读 · 0 评论 -
Park & Unpark
黑马视频教程:https://www.bilibili.com/video/BV16J411h7Rd?p=1081.基本使用park翻译他和wait和notify有点像,都可以用来控制线程的状态。它们是 LockSupport 类中的方法// 暂停当前线程LockSupport.park(); // 恢复某个线程的运行LockSupport.unpark(暂停线程对象)先 park 再 unpark。示例代码,下面代码为线程t1先睡1s再调用LockSupport.park暂停线程,原创 2022-05-22 23:07:16 · 81 阅读 · 0 评论 -
异步模式之生产者/消费者
黑马视频教程:https://www.bilibili.com/video/BV16J411h7Rd?p=1071.定义消费队列可以用来平衡生产和消费之间的平衡生产者仅负责产生结果的数据,不关心数据如何处理,而消费者专心处理数据的结果消息队列容量有限为空消费者无法消费,满时生产者无法生产。JDK中的各种阻塞队列采用的就是这种模式。2.实现代码注释详细/** * 消息类 */@Slf4jclass Message{ private int id; private原创 2022-05-22 17:02:51 · 207 阅读 · 0 评论 -
同步模式之保护性暂停
黑马视频讲解:https://www.bilibili.com/video/BV16J411h7Rd?p=98&spm_id_from=333.1007.top_right_bar_window_history.content.click定义英文为Guarded Suspension,用在一个线程等待另一个线程的执行结果。要点:有一个结果需要从一个线程传递到另一个线程,让他们关联同一个GuardedObject如果有结果不断的从一个线程传递到另一个线程那么可以使用消息队列(见生产者/消费原创 2022-05-19 22:16:29 · 169 阅读 · 0 评论 -
wait notify原理
黑马视频讲解:https://www.bilibili.com/video/BV16J411h7Rd?p=89wait notify 原理owner线程发现条件不满足,调用wait方法,既会进入Monitor锁中的WaiSet集合中变为WAITING状态BLOCKED和WAITING的线程都处于线程阻塞状态,不占用时间片。BLOCKED中的线程会在Owner中的线程释放锁时被唤醒并且非公平的去竞争锁。WAITING状态的线程会在Owenr中的线程调用notify或者notifyAll时唤醒,但原创 2022-05-17 22:00:57 · 128 阅读 · 0 评论 -
Java对象的组成 && 对象头
参考视频:https://www.bilibili.com/video/BV16J411h7Rd?p=75参考博客:https://blog.csdn.net/weixin_43896929/article/details/121999131?spm=1001.2014.3001.5501一. JAVA对象的组成Java对象由:1. Java对象头 2.实例数据 3.对齐填充字节Java的对象头由以下三部分组成:Mark WordKlass Word(类指针)array length(数原创 2022-05-14 17:24:43 · 386 阅读 · 0 评论 -
Java中变量的线程安全分析
成员变量和静态变量是否线程安全?如果它们没有被共享也就是只有一个线程访问说明是安全的。如果它们被共享了,则要根据它们的状态是否能改变来判断是否线程安全。那么又分为两种情况:1.如果只有读操作,那么肯定是线程安全的2.如果涉及到读写那么这段代码就是临界区就涉及到了线程安全问题。局部变量是否线程安全?局部变量是线程安全的但局部变量引用的对象则未必1.如果该对象没有逃离方法的作用访问,它是线程安全的2.如果该对象逃离方法的作用范围,需要考虑线程安全总结归根结底就是要判断某个变量指向的原创 2022-05-12 23:15:14 · 670 阅读 · 0 评论 -
操作系统中进程的五种状态与JAVA中线程的六种状态
操作系统中的五种状态新建:创建新的进程就绪:进程已经获得除CPU时间片以外的任何资源,一旦获得cpu时间片就能立马执行。执行:处于就绪队列中的进程获得了时间片运行进程。阻塞:进程时间片用完进入阻塞队列中等待唤醒。终止:进程执行完毕。JAVA中线程的六种状态java中的线程状态直接看Thread中的State状态源码。1. NEW根据源码中解释 Thread state for a thread which has not yet started.翻译过来就是尚未启动的线程的线程状原创 2022-05-11 23:25:25 · 1736 阅读 · 1 评论 -
两阶段打断终止
两阶段打断终止在线程T1中优雅的终止另线程T2,也就是给线程T2在收到打断指令后不是直接强制的停止T2线程而是给T2一些缓冲时间处理后事,处理完之后T2再自动停止。实现方法无非就是在T2线程中判断自己的线程是否被打断了,被打断了就是执行一些后续操作执行完之后自行退出,加一个if判断即可。代码:@Slf4jpublic class TestTwoInterrupted { public static void main(String[] args) throws InterruptedE原创 2022-05-11 21:25:07 · 151 阅读 · 0 评论 -
Thread中start与run的区别
start表示启动线程,run只是执行线程体中的run方法并没有启动线程。run方法示例如下:@Slf4jpublic class TestStartAndRun { public static void main(String[] args) throws InterruptedException { Thread thread = new Thread() { @Override public void run() {原创 2022-05-10 21:43:47 · 356 阅读 · 0 评论 -
线程运行原理-栈帧图解
黑马视频讲解地址:https://www.bilibili.com/video/BV16J411h7Rd?p=21示例结合代码分析线程运行的原理。代码如下,很简单就是main方法中调用m1方法,m1方法再调用m2方法。public class Test01 { public static void main(String[] args) { m1(10); } public static void m1(int x){ int y = x原创 2022-05-10 18:20:01 · 633 阅读 · 0 评论