- 博客(5)
- 收藏
- 关注
原创 深入AQS
整个分析过程遵循:先了解结构,循序渐进,然后将各部分内容串起来。 通过lock接口一步一步引入AQS,了解AQS。 lock接口的出现原因: ·使用synchronized关键字将会隐式地获取锁,释放锁。整个行为都是隐式进行,不需要干预,所以不灵活 ·获取到锁的线程没办法相应中断,线程被中断后抛出中断异常释放锁。 ·没办法指定获取锁的超时时间 ·....................
2019-05-20 18:09:03
219
原创 Java中解决可见性采取的方案
可见性的由来 由于CPU、内存、IO设备这三者性能是相差很大的。 如果CPU要等待内存,那么就很浪费CPU资源,利用率就很低。 所以为了平衡他们之间的差异,最大化的利用CPU资源做出如下努力: 1、高速缓存(引来了缓存不一致问题--》CPU层面的解决方法(1、总线锁(性能影响) 2、缓存锁(降低锁的粒度来提高性能)(实现:通过缓存一致性协议))) 2、线程和进程(CPU时间片的切...
2019-05-19 01:37:48
866
原创 wait-notify/notifyAll
先说例子,再说原理。 等待/通知机制:在某个条件下等待,当条件满足时,通过它结束等待,继续执行。 简单实现: 等待方: public class Waiter { public static volatile int flag = 0; public static void setFlag(int flag) { Waiter.flag = ...
2019-05-18 19:01:10
490
原创 synchronized
synchronized修饰在实例方法、静态方法,代码块上的区别: 1、修饰在实例方法上使用的锁是:this(也就是当前对象的对象头) 修饰在静态方法上使用的锁是:类的class(类加载后存储在方法区中的class对象的对象头) 2、如果使用的是this对象:只有当多个线程使用的是同一个对象时,才可以保证线程安全。 反例:这两个用的不是同一个锁。 publiccla...
2019-05-18 15:39:20
158
原创 Java数据结构-数组
基础知识: 1、HotSpot虚拟机中,如果对象是一个Java数组,那在对象头中会保存一块用于记录数据长度的数据,从数组的元数据中无法确定数组的大小。 2、对象的内存布局:对象头,实例数据,填充 数组: 对于一个原始类型的数组,一般需要24字节的头信息再加上保存值所需要的内容。 24字节的头信息分别包含:1、对象开销 --16字节2、用于保存长度 --4字节3、填充字...
2019-05-18 11:38:06
181
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人