CAS的原理 CAS(compareAndSwap),比较交换,是一种无锁的原子算法。 Cas(value,expect,newValue),如果vaule和ecpect一样,就更新为newValue,否则什么也不做,返回false 实现原理 通过调用unsafe.compareAndSwapInt ...
分类:
其他好文 时间:
2019-10-11 12:41:27
阅读次数:
61
首先关于唯一id生成,个人比较推崇美团的Leaf,具体介绍可见链接: https://tech.meituan.com/2017/04/21/mt-leaf.html 但这个框架未免有些太重了,笔者之前看到项目中生成方式是时间戳(精确到秒)+四位随机(数字+字母)的方式,看起来简单轻巧,但在高并发场 ...
分类:
其他好文 时间:
2019-10-11 01:15:43
阅读次数:
79
1.9 再论shared_ptr 的线程安全 虽然我们借shared_ptr 来实现线程安全的对象释放,但是shared_ptr 本身不是100% 线程安全的。它的引用计数本身是安全且无锁的,但对象的读写则不是,因为shared_ptr 有两个数据成员,读写操作不能原子化。根据文档11,shared ...
分类:
编程语言 时间:
2019-10-08 20:31:03
阅读次数:
540
ThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数据,线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用。 ThreadLocal提供了线程安全的另一种思路,我们平常说的线程安全主要是保证共享数据的并发访问问题,通过sychronized锁或者CAS无锁策略 ...
分类:
其他好文 时间:
2019-10-03 10:33:26
阅读次数:
93
1、atomic_flag 和atomic<>的区别,atomic_flag 无论无锁是多大代价(一些cpu可能无锁代价大),都保证atomic_flag 是无锁的。atomic<>会视情况,可能是有锁的也可能是无锁的,哪个开销小选哪个。 2、C++内存模型可以被看作是C++程序和计算机系统(包括编 ...
分类:
其他好文 时间:
2019-10-01 09:31:40
阅读次数:
103
概述 在开发过程中,我们经常会遇到并发问题,解决并发问题通常的方法是加锁保护,比如常用的spinlock,mutex或者rwlock,当然也可以采用无锁编程,对实现要求就比较高了。对于任何一个共享变量,只要有读写并发,就需要加锁保护,而读写并发通常就会面临一个基本问题,写阻塞读,或则写优先级比较低, ...
分类:
数据库 时间:
2019-09-22 15:27:39
阅读次数:
164
Linux kernel里面从来就不缺少简洁,优雅和高效的代码 比如,通过限定写入的数据不能溢出和内存屏障实现在单线程写单线程读的情况下不使用锁。因为锁是使用在共享资源可能存在冲突的情况下。还用设置buffer缓冲区的大小为2的幂次方,以简化求模运算,这样求模运算就演变为 (fifo->in & ( ...
分类:
系统相关 时间:
2019-09-20 21:37:27
阅读次数:
186
Log4j 系列 log4j是apache实现的一个开源日志组件 logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4j的一个日志框架,是slf4j的原生实现 log4j2是log4j 1.x和logback的改进版,据说采用了一些新技术(无锁异步、等等),使得日志的吞 ...
分类:
编程语言 时间:
2019-09-17 12:47:37
阅读次数:
126
1.轻量级锁(Lock)与重量级锁(synchronized):都是可重入锁 2.可重入锁(递归锁):方法中嵌套方法,锁可传递 3.读写锁(ReentrantReadWriteLock)--读写分离 读锁(获取该值信息)和写锁(对该值操作) 4.乐观锁 本质没有锁,效率比较高、无阻塞、无等待、重试。 ...
分类:
其他好文 时间:
2019-09-15 14:14:55
阅读次数:
130
本文链接:https://blog.csdn.net/xhjcehust/article/details/45844901笔者之前照着通用写法练手写过一个小的线程池版本,最近几天复习了一下,发现大多数线程池实现都离不开锁的使用,如互斥量pthread_mutex*结合条件变量pthread_cond ...
分类:
编程语言 时间:
2019-09-13 13:12:34
阅读次数:
138