前两篇文章已经介绍了多线程以及 JMM,我们说过多线程面对的安全问题体现在 `可见性 重排序`三个问题上。Synchronized 就是 Java 为我们提供的解决线程安全问题的一把锁。 以前我们都叫它重量级锁,是因为以前它的性能相比与其他锁要差很多,而且非常笨重。但是随着 JDK 1.6 中对 S ...
分类:
编程语言 时间:
2020-01-06 19:30:22
阅读次数:
76
发现 zeromq 的 yqueue_t 模板类,其数据存储理念设计得非常妙。借这一理念,按照 STL 的泛型类 queue 的接口标准,我设计了一个线程安全的 单生产者/单消费者(单线程push/单线程pop) FIFO 队列,以此满足更为广泛的应用。 1. 数据存储理念的 ...
分类:
编程语言 时间:
2020-01-01 23:46:14
阅读次数:
110
后端开发中大家肯定遇到过实现一个线程安全的计数器这种需求,根据经验你应该知道我们要在多线程中实现共享变量的原子性和可见性问题,于是锁成为一个不可避免的话题,今天我们讨论的是与之对应的无锁CAS。本文会从怎么来的、是什么、怎么用、原理分析、遇到的问题等不同的角度带你真正搞懂CAS。为什么要无锁我们一想到在多线程下保证安全的方式头一个要拎出来的肯定是锁,不管从硬件、操作系统层面都或多或少在使用锁。锁有
分类:
其他好文 时间:
2019-12-27 15:26:29
阅读次数:
97
1、锁状态 锁的状态只能升级不能降级。 无锁 没有锁对资源进行锁定,所有线程都能访问并修改同一个资源,但同时只有一个线程能修改成功。其他修改失败的线程会不断重试,直到修改成功,如CAS原理和应用是无锁的实现。 偏向锁 偏向锁是指一段同步代码一直被一个线程访问,那个该线程会自动获取锁,降低获取锁的代价 ...
分类:
编程语言 时间:
2019-12-19 00:04:59
阅读次数:
103
一、CAS(无锁的执行者) CAS包含3个参数:内存值 V 旧的预期值 A 新值 B 当且仅当V值等于A值时,将V的值改为B值,如果V值和A值不同,说明已经有其他线程做了更新,则当前线程什么都不做,最后返回当前V的真实值。CAS操作是抱着乐观的态度进行的(乐观锁),它总是认为自己可以成功地完成操作。 ...
分类:
其他好文 时间:
2019-11-21 13:45:47
阅读次数:
77
上面是网上拷的图 具体的转换周志明那本书上都有,这张图解决我自己的疑惑的地方有: 1、markword 01标志既可以是无锁,也可以是偏向锁。所以前面需要有一个标志位标志是否偏向锁。 2、如果线程A占有偏向锁,线程B竞争获取偏向锁要等到线程A执行到safepoint(safepoint这个以后再讲) ...
分类:
其他好文 时间:
2019-11-17 21:05:46
阅读次数:
112
一、锁分类 线程要不要锁住同步资源?锁住--悲观锁不锁住--乐观锁 锁住同步资源如果失败,线程要不要阻塞?阻塞不阻塞--自旋锁,适应性自旋锁 多个线程竞争同步资源的流程细节上的区别?不锁住资源,多个线程中只有一个能够修改资源成功,其它线程会去重试--无锁同一个线程执行同步资源时自动获取资源--偏向锁 ...
分类:
编程语言 时间:
2019-11-13 23:49:44
阅读次数:
114
table th:first of type { width: 70px; } 锁的类型 | 锁的实现 | 乐观锁 | 在数据库中可以使用version版本号去实现;在Java中是使用CAS(Compare And Swap)算法(CAS算法:是一种无锁算法,是Java提供的非阻塞原子性操作,CAS ...
分类:
编程语言 时间:
2019-11-01 16:29:48
阅读次数:
81
实现的模拟多线程实现售票是每个学习多线程的初学者必须要学会掌握的知识点, 既然掌握的它, 我们自然要举一反三 So~, 无锁版出现了 What无锁? 假如两个线程同时修改一个变量的场景下 我们需要三个值, 预期值(线程副本变量中的值), 主存值(从主存变量中的值), 新值(我们要设置的值) 如果 预 ...
分类:
编程语言 时间:
2019-10-19 13:25:04
阅读次数:
98