Java多线程
文章平均质量分 75
米兰的小铁匠z
成长随笔,记录学习的点滴。
展开
-
ReentrantLock基础知识
翻译成中文,ReentrantLock表示可重入锁,与synchronized一样,都是属于可重入锁。与synchronized相比具有如下特点:可中断:synchronized只能等待同步代码块执行结束,不可以中断,而reentrantlock可以调用线程的interrupt方法来中断等待,继续执行下面的代码。可以设置超时时间:调用lock.trylock(),如果没有设置等待时间的话,没获取到锁,将返回false可以设置为公平锁:公平锁其实是为了解决饥饿问题,当一个线程由于优先级太低的时候,就原创 2021-02-19 17:07:31 · 8465 阅读 · 5 评论 -
Java 多线程park unpark 原理
介绍:park unpark 与wait、notify很像,但是park unpark是属于每个线程私有的,而wait、notify是属于Object对象的,相同的就是两者调用后都会进入WAIT状态,没去唤醒的话就一直等待下去。park 对象由三部分组成_counter,_cond,-mutex。看一个例子来说明:public static void main(String[] args) { Thread t1 = new Thread(() -> {原创 2021-02-06 11:31:20 · 1016 阅读 · 1 评论 -
Java多线程 异步模式之生产者消费者模式
之前学习过的同步模式是保护性暂停,存在一定的缺陷,我们当初举例是两个线程,线程A收信人,线程B送信人,使用一个信箱充当一个中间过渡的介质。在多任务的情况下,收信人存在多个,发信人就得存在多个,而且只有当送信者将信件送到指定的收信人手中,一个任务才算完成,这中间的操作是同步进行的,因此属于同步模式下的多线程任务。弊端也很明显,实际情况下,送信者只需要把信件放入信箱通知收信人即可,而不需要等到收信人拿到信才算结束,因为送信人把信收到信箱通知收信人后还可以接着送下一份信件,这中间送信人的时间没有得到充分的利用。原创 2021-01-31 17:14:17 · 377 阅读 · 0 评论 -
Java多线程 同步模式之保护性暂停
1. 保护性暂停定义即 Guarded Suspension,用在一个线程等待另一个线程执行结果。重点:有一个线程的结果需要传递给另一个线程,让它们关联同一个GuardedObject如果有结果连续不断由一个线程传递另一个线程,则需要考虑消息队列JDK中,join(),Future采用的就是这种模式因为这是一方要等待到另一方的结果,所有这是一种同步模式。图示:2. 实现根据上图实现一个t1线程等待t2线程下载响应@Slf4j(topic = "c.TestGuardedObject原创 2021-01-30 20:52:26 · 262 阅读 · 0 评论 -
Java多线程wait/notify原理
1. 引入wait/notify回顾:在之前的学习中,当我们创建一个对象后,synchronized给对象上锁,JVM会给对象头关联一个Monitor对象,这个Monitor由三部分组成。一是Owner对象,里面存储的是创建该对象的线程二是EntryList,想试图获取该对象资源的其它堵塞线程队列三是WaitSet,存储的是放弃对象锁的线程Owner线程中的锁对象,如果发现条件不满足,调用wait()方法,既可以进入到WaitSet变为WAITING状态EntryList下和WaitSet下原创 2021-01-30 16:44:01 · 925 阅读 · 0 评论 -
Java Monitor对象与Synchronized原理
Java对象头Java的世界里,万物皆对象,对象是类的实例,类是抽象的,对象是具体的…这些都是Java对象的一些常见介绍。今天我们要学习的是Java对象的底层结构对象头的部分,它是Java对象的一部分,看一张HotSpot虚拟机中 Java对象的结构图:在32位虚拟机中普通Java对象头,占8个字节:KlassWord (32bits):指的是该对象的类型,占4个字节MarkWord (32bits):存放Monitor 对象的指针的引用地址,待介绍。数组对象头,占16个字节:与普通J原创 2021-01-24 22:16:49 · 1773 阅读 · 1 评论 -
两个经典的线程安全示例分析
示例1:卖票与买票@Slf4j(topic = "c.CASE1")public class CASE1 { //随机数 public static Random random = new Random(); public static int getRandom(){ return random.nextInt(5) + 1; } public static void main(String[] args) { //开始有200原创 2020-12-13 14:34:41 · 429 阅读 · 0 评论 -
Java线程的6种状态
Thread.StateThread的6种状态对应了Thread.State的一个枚举类 public static enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED; private State() { } }NEW 新生状态RUNNABLE原创 2020-11-29 15:25:45 · 175 阅读 · 0 评论 -
守护线程
守护线程名字很熟悉,却一直记不住是干嘛用的,最近在学多线程,随手mark一下。所谓守护,其实在有参照物的情况下,例如线程t1,t2两个线程同时启动,默认情况下两个线程都不是守护线程,因为它们都没有可以 ''守护''的线程。此时如果t2设置为守护线程,t1就是它的守护对象,此时有一个特点,就是t1线程只要一执行完毕,t2也会跟着结束进程。可以观察一个例子://当t1,t2没有守护线程时,同时启动t1,t2线程,//t1指的是main,t2指的是thread @Slf4j(topic = "c.Te原创 2020-11-29 14:38:46 · 221 阅读 · 0 评论 -
Java多线程之两阶段终结模式
场景:我们如何在t1 线程中终止t2 线程呢?错误思路❌stop():调用Thred的静态方法直接杀死线程System.exit(int):除了直接杀死线程,还会直接停止掉运行线程的应用程序为什么说这是错误的思路呢?比如t1 调用了 t2线程,此时需要终止掉t2线程,但是在t2 线程体中还有被锁住的共享资源,此时还未释放锁,如果直接调用stop()方法去终止线程,那么t1就无法得到共享资源,显然这两种方法存在一定的弊端!!两阶段终结模式引入两阶段终结模式,也就是为了解决上述存在的弊端。简.原创 2020-11-28 16:32:21 · 225 阅读 · 1 评论