本文用于记录学习黑马JUC课程后,个人认为有价值的笔记,核心内容均围绕标题展开。既做一个学习的记录,同时也做一个沟通交流,欢迎各位大佬互动~
活跃性
多把锁:使用多个锁来保护不同的资源或实现更细粒度的并发控制。这种情况下,可以使用多把锁的概念。
活跃性(Liveness)是指在并发程序中,系统能够持续地做出进展,不会出现死锁、活锁和饥饿等问题。
死锁: 一个线程需要获得多把锁, 就容易发生死锁. t1线程获取对象A的锁,需要获取B的锁; t2线程获取对象B的锁, 需要获取A的锁. 死锁是指两个或多个线程在互相等待对方持有的资源,导致它们都无法继续执行的状态。这种情况下,程序无法继续执行,进而无法完成任务。死锁是活跃性问题的一种形式。
定位死锁: 可以通过jconsole工具, 或者jps定位进程id, 再用jstack定位死锁
活锁(Livelock):互相改变对方的结束条件.
活锁是指线程在不断地改变自己的状态,但是却无法取得进展,导致无法完成任务。在活锁中,线程不断地响应其他线程的动作,但是整体上却没有进展。活锁可能导致系统无法正常工作。
饥饿(Starvation):饥饿是指某个线程或资源由于无法获得所需的资源而无法继续执行的情况。当某些线程或资源被其他线程过度占用,导致某些线程无法获得资源,就会发生饥饿现象。饥饿可能导致某些线程无法完成任务。
ReentrantLock
可重入: 指一个线程如果首次获得这把锁, 那么因为它是这把锁的拥有者, 因此有权利再次获取这把锁, 如果是不可重入锁, 则第二次获取会被自己的锁挡住.
可打断(lock()方法加锁不可打断): lockIterruptibly()
如果没有竞争就获得lock对象锁; 如果有竞争就进入阻塞队列, 可以被其他线程用interrupt方法打断
锁超时: lock.trylock(‘时间(也可无参)’, 时间单位); lock为reentrantlock对象, 方法返回布尔值(ture为获取到); 也可打断
公平锁(解决饥饿问题): 默认是不公平的, 修改reentranLock带参的构造方法, 就可以改为公平锁.
条件变量:是一种线程同步机制,用于在多线程编程中实现线程间的协作和通信。条件变量通常与锁(Lock)结合使用,用于控制线程的等待和唤醒。
条件变量提供了以下两个基本操作:
等待(wait):一个线程可以通过等待条件变量来暂停自己的执行。当线程调用条件变量的等待方法时,它会释放持有的锁,并进入等待状态,直到满足某个特定条件(由应用程序定义)或被唤醒。
唤醒(signal):一个线程可以通过唤醒条件变量来通知其他线程继续执行。当线程调用条件变量的唤醒方法时,它会选择一个或多个等待在该条件变量上的线程,并使其从等待状态转变为可运行状态。