synchronized & volatile

Thread

Java中没有 线程.对应的是 OS 中的线程.

synchronized & reentrantlock

sync 对 方法枷锁. 在同一时间只能有一个Thread访问这个方法.

重量级锁

jvm 早期的 sync 是重量级别的锁

早期 jvm 不对锁进行操作. 是OS 管理 线程和锁

等到 可以返回时返回给 jvm

轻量级锁

jvm 内部 管理 的锁
atomic 使用的就是 轻量级锁,自旋锁

实现

内部方法
在这里插入图片描述
在这里插入图片描述

1 一个值,刚刚开始的时候是	0
2 一个Thread 将 value + 1,写入到 主存中.
3 这时候进行比较,value 是不是 0. 如果是0的话,则写入主存
4 如果不是	0,value == 1的话,则将 value 再次读取到自己空间. 进行操作
5 最后重复上面的步骤. 进行操作

这种方式 就可以叫做自旋锁,也可以叫做无锁

问题

1 会引起 ABA问题

就是 Thead-a 在写入到 主存中,需要查询主存的值是否是0.
如果这时 主存中的值 是 0	1		0. 那么这就是 ABA 问题

1 解决

添加版本号. 可以添加  Bool 或者 时间戳进行解决

2 原子性问题

cas 只能实现 最终xxxx 这里没听着,再听一遍

在这里插入图片描述
在这里插入图片描述

如果计算机是 多核. 则执行下面的汇编语句 

自旋 & 阻塞

一个占用 CPU,一个阻塞

contextSwitch

线程切换
自旋适合 任务短,任务少的场景
阻塞适合 任务多,执行时间长的场景

升级过程

在这里插入图片描述

偏向锁

不是锁. 是一种同步的机制

没有锁 竞争. 将 ThreadID 和 资源联系起来.

轻量级锁

1 一开始的时候,使用自旋的方式. 等待
2 
	在Thread多的情况下,就将 Thread 及 锁交给 OS 管理
	在之前任务时间长的情况下,升级重量级锁

我们可以在指定自旋多少圈的情况下 升级重量级别的锁

AQS

voatile & CAS

volatile

可见性 指令重拍

CAS

对象创建过程

对象内存布局

as -if -serial

happens-before

ThreadLocal

ThreadLocal内存泄漏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值