Java学习总结(1.2.3) Java锁相关

精贴 置顶
1591 0
作者:      发布时间: 2020-03-31 00:02:37

----------原子操作封装类

AtomicBoolean:原子更新布尔类型

Atomiclnteger:原子更新整型

AtomicLong:原子更新长整型

----------数组的

Atomiclntegerarray:原子更新整型数组里的元素。

AtomicLongArray:原子更新长整型数组里的元素。

AtomicreRerenceArray:原子更新引用类型数细里的元素。

----------类内部的变量(volatile)

AtomicIntegerFieldUpdater:原子更新整型的字段的更新器。

AtomicLongFieldUpdater:原子更新长整型字段的更新器。

AtomicReferenceFeldUpdater:原子更新引用类型里的字段。

----------约定通过修改Thread抢锁

AtomicReference:原子更新引用类型。

AtomicStampedReference:原子更新帯有版本号的引用类型

AtomicMarkableReference:原子更新带有标记位的引用类型。


1.8更新

计数器增强版,高并发下性能更好

更新器: DoubleAccumulator、 LongAccumulator

计数器: DoubleAdder、 LongAdder

原理:分成多个操作单元,不同线程更新不同的单元只有需要汇总的时候才计算所有单元的操作

场景:高并发频更新、不太频緊读地读取。

数据没那么准确。



CAS的三个向题

1.循环+CAS,自旋的实现让所有线程都处于高频运行,争抢CPU执行时间的状态。如果操作长时间不成功,会带来很大的cPU资源消耗。

2.仅针对单个变量的操作,不能用于多个变量来实现原子操作。

3.ABA问题。 (比较不充分)


-------------------------------------------------------------------------

Synchronized从使用到原理

Synchronized是JVM提供

Lock是JDK提供


JAVA中锁的概念

自旋锁:是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。 (也是乐观锁)

乐观锁:假定没有冲突,在修改数据时如果发现数据和之前获取的不一致,则读最新数据,修改后重试修改

悲观锁:假定会发生并发冲突,同步所有对数据的相关操作,从读数据就开始上锁。


独享锁(写):给资源加上写锁,线程可以修改资源,其他线程不能再加锁;(单写)

共享锁(读):给资源加上读锁后只能读不能改,其他线程也只能加读锁,不能加写锁;(多读)


可重入锁、不可重入锁:线程拿到一把锁之后,可以自由进入同一把锁所同步的其他代码。

公平锁、非公平锁:争抢锁的顺序,如果是按先来后到,则为公平。



同步关键字 synchronized

1、用于实例方法、静态方法时,隐式指定锁对象

2、用于代码块时,显示指定锁对象

3、锁的作用域:对象锁、类锁、分布式锁

4、引申:如果是多个进程,怎么办?

特性:可重入、独享、悲观锁锁

优化:锁消除(开启锁消除的参数:XX:+ Doescapeanalysis-xx:+ Eliminatelocks)

        锁粗化JDK做了锁粗化的优化,但我们自己可从代码层面优化

Note: synchronized关键字,不仅实现同步,JMM中规定, synchronized要保证可见性(不能够被缓存)。






标签:

每日一句

如果你能每天呐喊二十一遍「我用不着为这一点小事而烦恼」,你会发现,你心里有一种不可思议的力量。

标签云

vue
最近综合
情绪巨婴是什么 12.18
普通蛋糕做法 05.31
玉米烤肠芝士面包做法 05.31
Mysql安装教程 - 绿色版 06.18
我们学习知识为什么总是忘记呢?【学习金字塔】 05.12
Typora开发版⽆法使⽤解决⽅法 05.04
为什么无知者越自信? -- 达克效应 05.10
马斯洛需求层次理论 04.29
随机综合
中间件1.3.3-RabbitMQ持久化机制、内存/磁盘控制 04.29
Java学习总结(2.1.3) NIO非阻塞网络编程三大核心理念 04.17
php 用万网空间,提交数据中出现反斜杠问题 04.13
Java学习总结(2.1.1) TCP/UDP协议 04.17
我们学习知识为什么总是忘记呢?【学习金字塔】 05.12
电商运营主要做什么? 10.08
Java学习总结(1.1.1) Java程序运行原理分析 03.17
Java学习总结(1.1.3) 线程中止 03.17