![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
Memorys.Liu
it's bad but not too bad.
展开
-
java-并发-CAS
基本概念: 比较 然后 交换 compare and swap 参数:内存值 V,旧的预期值 A,要修改的新值 B 过程:如果 V和 A 相等,则将 V替换 为 B,否则 自旋。 缺点: ABA问题,A 变化为B ,再次变化为A 则检测不出来,需要用加版本号的方式来解决 如果自旋时间太长的话,开销就会很大。 CAS和锁的选择: 1. 在资源竞争不激烈的时候,可以使用CAS,可以在较短时间内获取到锁。 2. 在资源竞争激烈的时候,使用阻塞锁,避免CAS无限制自旋造成的性能开销...原创 2020-08-14 09:45:33 · 76 阅读 · 0 评论 -
java-并发-Volitile
作用: 1. 共享变量在线程之间的可见性 2. 禁止指令重排序 具体实现方式: 1. 共享变量在线程之间的可见性 多线程的情况下,多个线程操作同一个共享变量的时候,是把共享变量复制一份,复制到自己的线程内存中,然后在私有线程里去操作自己单独的变量。等线程执行完毕的时候,会把私有线程中的变量复制到共享变量中,更新共享变量。 线程可见性指的是,当线程A复制了数据num,线程B也复制了数据num,这时候线程A对num赋值2,线程B看到的是num=2 具体实现为,volatile在进行写操作的时.原创 2020-08-14 09:43:54 · 128 阅读 · 0 评论 -
java-并发-锁-死锁
什么是死锁: 死锁是一种特定的程序状态,一般为多线程彼此持有对方需要的锁,彼此还在等待获取对方持有的锁、 死锁的定位方式: jstack线程打印 死锁产生的原因: 1. 长期持有锁,使用完不释放 2. 循环依赖 如何避免死锁: 1. 尽量避免使用多个所,并且只有需要的时候才使用 2. 如果必须要使用多个锁,尽量设计好锁的获取顺序,可以将对象和锁的关系图形化展示出来 3. 使用超时机制 4. 通过不同的工具进行代码分析,查找出可能出现死锁的场景。 ...原创 2020-08-02 22:28:48 · 99 阅读 · 0 评论 -
java-并发-锁-AQS
主要包含: volatile int state 标记节点锁的状态 tryacquire tryRelease 独占获取锁和释放锁 (state 0 /1 代表锁是否被占用) tryAcquireShare 和 tryReleaseShare 共享获取锁和释放锁(state=0 代表所有的锁都被使用完,state>0 有未使用的锁) Node的FIFO队列: volatile Node pre 当前节点的前一个节点 volatile Node next 当前节点的下一个节...原创 2020-08-02 22:28:13 · 88 阅读 · 0 评论 -
java-并发-锁-Lock
底层原理: Lock底层是通过AQS实现的。 AQS底层是通过CAS实现的。 加锁过程: 独占锁: 通过tryAcquire方法,将state值从0设置为1,设置成功代表加锁成功 通过tryRelease方法,将state值从1设置为0,设置成功则代表释放成功 共享锁: 通过tryAcquireShared(arg),获取到的结果如果>=0则获取锁成功,如果<0则获取锁失败。并且在队列尾部增加一个Node节点自旋获取锁。 锁的重入: 独占锁: 通过tryA...原创 2020-08-02 22:26:20 · 106 阅读 · 0 评论 -
JAVA-面试题-02
58的一道面试题 public class Main { public static void main(String[] args) { List<Integer> list = new ArrayList<>(Arrays.asList(1,2)); add(list); for (int i = 0...原创 2019-06-10 17:43:59 · 95 阅读 · 0 评论 -
java-并发-锁-Synchronized
底层原理: Synchronized底层是通过monitorenter 和 monitorexit来实现的。 如果synchronize在方法上,那就没有上面两个指令,取而代之的是有一个ACC_SYNCHRONIZED修饰,表示方法加锁了。它会在常量池中增加这个一个标识符,获取它的monitor,所以本质上是一样的。 加锁过程: 如果monitor的进入数为0,则该线程进入monitor,然后将进入数设置为1,该线程即为monitor的所有者。 如果线程已经占有该monitor,只是重.原创 2020-06-19 00:18:02 · 131 阅读 · 0 评论