| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> synchronized其他知识 -> 正文阅读 |
|
[Java知识库]synchronized其他知识 |
上篇文章提到过,synchronized可以保证多线程之间的可见性和原子性。而且我们平时用的时候,很多时候都是直接在方法上加一个synchronized,这片文章主要介绍synchronized在使用过程中需要或者在synchronized实现上需要我们了解的一些细节以及注意事项 拿什么作为锁在使用synchronized时候,有一点需要注意的就是,我们要知道当前各个线程来抢夺的这个锁,它到底是一个什么,这样在控制竞争的时候,我们知道线程是在一个什么范围才会去竞争这个锁。其实可以作为锁的资源就两种,一种是对象,一种是Class类。但是这两个锁资源又会分为不同的情况。 使用类实例对象作为锁synchronized直接加在方法上、synchronized(this){}作为代码块、或者自定义一个对象作为锁,都是使用类对象作为锁,这种情况有一个要注意的是,如果当前类存在多个实例对象的时候,对象之间的锁不是一个锁,各自是各自的,如果是单例不会存在问题,但是如果当前类存在多个对象,要注意不同对象之间是会竞争不同的锁。
使用类class对象作为锁使用类class对象作为锁,有两种方式,一种是在static静态方法上加锁,用的是当前类的Class,一种是synchronized代码块直接用某个类的.class进行锁定。使用类作为锁可以保证不论创建多少对象,最终能争抢的资源始终是一个,就是指定的类Class,因为不管对象创建多少个,最终所有的类只有一个Class。
synchronized的四种状态在这里要提一下的就是,我们知道在原本的java版本中,非常不推荐使用synchronized关键字来锁定资源,因为它是一个重量级锁,性能差,但是在 锁升级在1.6之前,synchronized直接就是一个重量级锁,没有状态一说,但是在之后的优化中,给它增加了四种锁状态做优化,由轻到重分别是 对象头对象在存到内存中的时候,在 monitor在上篇文章我们看到加了synchronized关键字的代码块,会有
简单的看下其实就可以看出来,,每个monitor其实就是记录了所有线程对当前锁的一个竞争,或者使用的信息 升级过程上边了解了对象头和monitor,我们也知道这两个互相配合,才能完成多线程情况下,对一个锁头的竞争以及竞争的状态的记录,下边简单的说一下锁的升级过程 无锁首先对象头默认是会处于一个无锁的一个状态,因为线程还没有来竞争 偏向锁当第一个线程来的时候,拿到了这个锁,就会给对象头打上一个偏向锁的状态,并且将自己的线程ID记录在对象头,如果下次来拿锁的还是这个线程,并且看到现在对象头是一个偏向锁的状态,就直接判断存储的偏向的线程ID是不是自己,如果是自己的话,就不需要进程到下一个状态,直接就能拿到锁,甚至可以理解为,锁本来就是自己的,可以直接去操作锁着的资源。 如果下一个线程来竞争的时候,发现是偏向锁,并且线程ID不是自己,就会去判断对应线程ID的线程是否还存活,如果是存活,并且还在执行锁内部的代码,不能释放锁,就将锁升级为下一个状态,如果对应的线程不存在或者不使用锁了,就将锁对象设置为无锁状态,重新走偏向锁的流程。 轻量级锁如果开始发生锁竞争,首先发生的就是用轻量级(
重量级锁如果锁进入到了重量级的状态,有线程被阻塞到 释放拿到锁之后,执行完锁住的代码块,就会执行 总结本片文章主要介绍了 参考文章: https://www.jianshu.com/p/19f861ab749e |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 16:41:58- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |