摘要:
Condition队列节点状态=-2,释放锁失败把自己设置为1。加到AQS状态是0,加到AQS之前判断是不是-2,不是就不加。如果是1就放到condition队列不管,然后去清理。 某段代码执行需要获取锁,就是单线程的,不需要获取锁就是线程不安全的。释放了锁就不是线程安全的。 获取锁的位置相当于sy 阅读全文
摘要:
队列不卡死,一定要:前面节点变成头结点唤醒时候能够唤醒后面节点,依次类推。 设置前面节点=-1就是为了前面节点走的时候,唤醒自己。 正常没有阻塞节点,设置前面=-1,再旋转一次尝试获取锁,才阻塞。即使设置前面节点=-1之前,前面节点=0唤醒失败走了,也不要紧,自己会再次旋转一次获取锁。设置-1之后, 阅读全文
摘要:
出队时候,如果队列处于稳定状态,那么就是一个挨着一个出队,难点在于出队的时候,队列正处于调整阶段,那么此时队列中的关系是混乱无章可寻的。 出队:unlock释放锁,不在队列线程去抢锁,队列第一个正常节点没有阻塞会自旋时候尝试获取锁,head=-1,唤醒第一个status正常节点(可能是head.ne 阅读全文
摘要:
AQS的思想(稳定思想):即使确定了正常节点,这个节点也可能下一秒异常,即使找到了正常节点,这个节点可能只是异常status=0/-1的节点,这些都不要紧,都只是在自己旋转‘生命周期’里面和自己所看到的 最大可能的保证队列的稳定状态,如果判断错了,其他节点会帮着处理直到队列真正的稳定。 AQS的思想 阅读全文
摘要:
首先,一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。 所以,Thread.stop, Thread.suspend, Thread.resume 都已经被废弃了。而 Thread.interrupt 的作用其实也不是中断线程,而是「通知线程应该中断了」,具体到底中断还是继续运 阅读全文
摘要:
AtomicLong是作用是对长整形进行原子操作,显而易见,在java1.8中新加入了一个新的原子类LongAdder,该类也可以保证Long类型操作的原子性,相对于AtomicLong,LongAdder有着更高的性能和更好的表现,可以完全替代AtomicLong的来进行原子操作。 AtomicL 阅读全文
摘要:
接下来看看volatile是如何解决上面两个问题的: 被volatile修饰的变量在编译成字节码文件时会多个lock指令,该指令在执行过程中会生成相应的内存屏障,以此来解决可见性跟重排序的问题。 内存屏障的作用: 1.在有内存屏障的地方,会禁止指令重排序,即屏障下面的代码不能跟屏障上面的代码交换执行 阅读全文
摘要:
LinkedHashMap底层存储结构与HashMap一样,不同的是LinkedHashMap增加了一个双向链表的头节点,插入的数据除了插入HashMap,还会插入链表中,因而可以保存插入节点的顺序 LinkedHashMap的节点在HashMap节点的基础上增加了前后节点的引用 LinkedHas 阅读全文
摘要:
1. 为什么无法创建更大的数组? Attempts to allocate larger arrays may result in OutOfMemoryError 如果数组长度过大,可能出现的两种错误 OutOfMemoryError: Java heap space 堆区内存不足(这个可以通过设 阅读全文
摘要:
public class test { @SuppressWarnings({ "rawtypes", "unchecked" }) public static void main(String[] args) { HashMap1 hh = new HashMap1(3); //链表添加 hh.put(0, "0... 阅读全文