- 博客(10)
- 收藏
- 关注
原创 wait notify notifyall
问题2回答:notifyall是唤醒所有等待的线程,而notify是只唤醒一个等待的线程。生产者2抢到了锁,因为柜台已经有一个了,所以生产者2就处于一个等待的状态,消费者1又抢到了锁,消费了之后唤醒了消费者2,消费者2看了下柜台,没有产品继续等待,消费者1又抢到了锁,也看了下柜台没有产品继续等待,此时只剩下生产者1了,它拿到锁,生产了一个,却唤醒了生产者2,生产者2醒来看了一些柜台已经有一个了,继续等待。生产者1又拿到了锁,然后看了下柜台已经有一个了,所以生产者1也处于等待状态。
2025-05-19 00:11:20
144
原创 锁信息存放和各种类型的锁
1)、markword(对象的hashcode,分代年龄,gc标记,锁的标记)不同的锁的状态,markword记录的信息是不一样的。二、偏向锁(只有一个线程在使用锁,避免获取锁与释放锁带来的性能损耗)3)、数组的长度(只有数组才有)2、实例对象:属性和值。锁的可重入是锁的一个功能,不是锁的一种类型。
2025-05-17 10:50:35
201
原创 monitor机制
1、_owner(持有锁的线程) 2、_waitset(存放所有处于wait状态的线程,集合) 3、EntryList(存放所有等待获取锁的这些线程,也就是处于block状态的线程队列) 4、recursions(记录的是锁的重入次数) 5、_count(记录这个线程获取锁的次数)monitor依赖底层操作系统的Mutex lock实现的,它是要由操作系统去实现线程之间的切换的,需要从用户态到操作系统内核态的转化,所以说成本相对比较高,因此monitor是一种典型的重量级锁的实现方式。
2025-05-07 22:26:32
348
原创 sychronized关键字使用
假如sychronized加在了普通方法上,启动多线程调用这个普通方法,得确保所有线程都是用的同一个当前this实例对象调用这个普通方法,说白了就是锁是同一把锁,都是当前this实例对象。假如有个线程用的是另外新new的一个对象,调用这个普通方法,那就肯定不生效,锁都是另外一把锁了。加在普通方法上,锁就是当前this实例对象。加在静态方法上,锁就是当前类的class对象。锁一定是个对象,对象锁。
2025-05-07 21:09:07
183
原创 线程知识点总结
切换上下文的时候,线程a需要保存它当前的运行状态,下次抢到cpu时间片,继续运行,需要先恢复状态,然后再继续向下执行,这样一来就肯定会有性能开销,可能还跑不过单线程的运行效率。始终抢不到cpu的时间片。进程之间是相互独立的,资源不共享。线程之间切换容易,进程之间切换更加耗费资源,代价更高。伴生现象:不太容易复现,每次运行的结果都可能不太一样。活锁:线程拿到了锁,却又相互释放,不去执行。轻量级:比进程耗费的资源少,运行速度更快。死锁:互相持有对方需要的锁,相互等待释放。线程:轻量级进程,时序调度的基本单元。
2025-04-28 22:08:23
292
原创 java泛型
实际上,泛型擦除的“结果”在运行阶段确实表现为类型信息被抹去(例如集合中存储的确实是 `Object`),但**类型擦除的过程本身发生在编译阶段**。如何直观的理解类型擦除,举个例子。需要明确擦除的过程是编译器完成的,生成的字节码已经没有了泛型信息,运行时只是按照擦除后的代码执行,所以用户看到的现象是运行时类型被擦除,但实际擦除的动作是在编译阶段完成的。还要解释用户可能存在的误区,比如认为运行时泛型信息还存在,但实际上JVM并不知道泛型的存在,所有类型检查在编译时完成,运行时只是处理原始类型。
2025-03-06 16:52:00
637
原创 学习方法研究
写作的前提就是自己得先梳理思路和体系(体系化),自己得完善细节(他人的输入可以完善自己的盲区),加深记忆(写过,讲过,讨论过的内容印象更深刻),锻炼能力(比如演讲,锻炼自己的临场反应与抗压能力,写作锻炼自己的写作能力),百利而无一害。培养自己的学习习惯,形成惯性,飞轮效应,形成习惯很难,一旦形成,后面就轻松了。5、实践,眼过千遍不如手动一遍,大多数学习,只是单纯的学习,不注重实践,其实实践才是真正的学习,单纯的学习不是学习,这是世人的误解!教员的实践论,王阳明的知行合一,懂得自然懂!
2025-02-23 16:31:50
271
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人