java锁的基本知识第一部分

50 阅读3分钟

进程和线程的区别

进程是资源分配的基本单位 线程是程序执行的基本单位

锁是一个逻辑不是一种技术

锁是为了保证数据的一致性的

synchronization() 代表着 synchronization(this)

status synchronization() 代表着 synchronization(*。class)

锁分两种

自旋锁成为轻量级锁,自旋锁是有一个while循环,一直尝试获取锁

进入等待队列的叫做重量级锁,重量级锁需要操作系统调度的锁

如何选择一个合适的锁

自旋锁的效率并不一定比重量级所得效率高。

因为如果任务执行的慢或者有很多的锁等待的话,就会有很多锁在自旋,这也是需要cpu的,线程切换,所以并不一定轻量级锁就快。

synchronization关键字的学习

synchronization 最早的版本是一个重量级锁,所以效率比较低 你使用过系统自带的自旋锁吗?

java有个juc的包,这个包里面都是通过cas实现的。atominteger 的 incrementAndGet 其底层就是自旋锁的实现方式,自旋锁就是获取到数字0,然后加1,然后回写的时候去比较看看原来的数字还是0吗,如果是修改为1。cas具体的实现是C++写的。

汇编语言lock 可以实现锁总线,这颗cpu在处理这个指令的时候,别人不能执行。

新版的 synchronization 是有一个锁升级的过程的

偏向锁、cas、重量级锁的升级过程

一个线程是偏向锁,两个线程是自旋锁

偏向锁其实不是锁,偏向锁不用抢,只要第一个线程过来就给了第一个线程。偏向锁为了解决有synchronization的代码,但是大部分时间都是单线程的代码的。

第二个进程来了以后发现已经有线程在用了,那就升级进入cas自旋锁吧。有竞争就升级。

比如我们经常用的 stringbuffer 的时候,其实他是自带synchronization关键字的,但是其实大部分使用stringbuffer的时候都是单线程的,如果有了锁竞争的话速度就慢了,但是有了偏向锁所以效率就得到了很大的提升。

无锁是一个自己发明的名词,没有准确的概念,无重量级锁叫做无锁,也有人说无cas的叫做无锁。

锁的四种状态

新建 的时候 无锁 , 如果第一个线程进来 ,进入偏向级锁 偏向锁 , 有了竞争后,进入轻量级锁 轻量级锁 ,如果自旋了多少次,然后就如重量级锁 重量级锁

如果查看对象的状态

可以通过jol获取对象的状态

新建一个对象有16个字节

前8个自己是markword,其实给一个对象上锁就是把自己的id写到这个对象的markword上

后面的4个字节表达,这个对象是属于那个类的 在后面的4字节,用来装成员变量,

但是如果没有成员变量会自动对齐,补充4个字节变成被8整除的字节数

对齐是为了提高效率的