乐观锁:认为数据修改产生冲突的概率并不大,所以不会先获取锁,一般都是使用版本号或者时间戳来标记,若A和B同时修改数据,当A修改完毕的同时将时间戳也替换为自己修改的时间戳,则B去修改时就会发现此条数据已经被修改过,则此次B则无法修改 优点:不对数据加锁,只有在对数据进行修改操作时才会进行校验不会影响服 ...
分类:
编程语言 时间:
2019-07-23 17:19:51
阅读次数:
99
一、互斥量mutex 保护共享数据,操作时,用代码把共享数据锁住,操作数据,解锁。其他线程要操作共享数据的线程必须等待解锁,锁住,操作,解锁。 互斥量就是类对象,一个锁,多个线程用lock()成员函数加锁这个锁头,只有一个线程能锁成功,成功的标志是lock函数返回,如果没有锁成功,那么流程就卡在lo ...
分类:
其他好文 时间:
2019-07-23 17:18:51
阅读次数:
155
结果:all goroutines are asleep - deadlock! 分析: 如果程序中途有结束操作,不会释放锁, 方案: 1、必须保证中途没有结束或者break操作 2、下列方式可以预防,在func结束后释放锁: ...
分类:
其他好文 时间:
2019-07-23 17:16:52
阅读次数:
207
一、锁的分类 对数据操作的类型:读锁(共享锁)、写锁(排它锁) 对数据操作对粒度:表锁、行锁 二、表锁(偏读) 特点:偏向MyISAM存储引擎,开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的概率最高,并发度最低。 MyISAM在执行查询语句前,会自动给涉及的所有表加读锁,在执行增删改操作前,会自动 ...
分类:
数据库 时间:
2019-07-21 12:03:27
阅读次数:
137
之前面试有被问到过,面试官很调皮,我擅长的点没有问,然后抽了一个点让我回答,这个点考察了源码的理解,当时只是大概记得是提前暴露,但是细节答得有些粗糙,特补充一下,,, 解决循环依赖的核心代码如上,首先会从singletonObjects缓存中取对象,如果对象不存在,但处于创建中,则加锁缓存,然后从提 ...
分类:
编程语言 时间:
2019-07-21 01:15:57
阅读次数:
99
LongAdder 提供了原子累计值的方法。 在高并发下N多线程同时去操作一个变量会造成大量线程CAS失败然后处于自旋状态,这大大浪费了cpu资源,降低了并发性。那么既然AtomicLong性能由于过多线程同时去竞争一个变量的更新而降低的,LongAdder思路把一个变量分解为多个变量,让同样多的线 ...
分类:
其他好文 时间:
2019-07-20 09:30:47
阅读次数:
90
前言 在高并发的环境下,当我们使用一个公共的变量时如果不加锁会出现并发问题,例如SimpleDateFormat,但是加锁的话会影响性能,对于这种情况我们可以使用ThreadLocal。ThreadLocal是将公共变量copy一份到线程私有内存中以消除并发问题,ThreadLocal是JDK内部提 ...
分类:
其他好文 时间:
2019-07-16 18:51:43
阅读次数:
96
ReentrantLock 是可重入锁,可重入锁的意思就是同一个线程可以重复获得该锁。 如何做到可重复获得该锁?计数器实现。 第一次加锁,cas比较是不是0,是0设置为1,并设置当前拥有锁的线程; 第二次及后续枷锁,调用acquire方法。 在计数器不是0的情况下,就会比较当前线程是不是同一个线程, ...
分类:
其他好文 时间:
2019-07-12 21:21:42
阅读次数:
144
JAVA head 分三个区域:1、新生代:1).Eden(伊甸园)区是新对象分配内存的地方,由于堆是所有线程共享的,因此在堆上分配内存需要加锁。而Sun JDK为提升效率,会为每个新建的线程在Eden上分配一块独立的空间由该线程独享,这块空间称为TLAB(Thread Local Allocati ...
分类:
编程语言 时间:
2019-07-11 20:26:24
阅读次数:
106
偏向锁 Hotspot 的作者经过以往的研究发现大多数情况下锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁。当一个线程访问同步块并获取锁时,会在对象头和栈帧中的锁记录里存储锁偏向的线程 ID,以后该线程在进入和退出同步块时不需要花费 CAS操作来加锁和解 ...
分类:
其他好文 时间:
2019-07-11 12:50:40
阅读次数:
273