Java多线程—Synchronized关键字底层原理

在说synchronized的相关底层实现我们就简单聊一聊synchronized的用法,其实最常用的就两种方式,直接去修饰一个方法,我们把这个方法叫做同步方法,或者用大括号去修饰一个代码块,当然代码块里的内容就叫做同步代码块

    public synchronized void fun(){
     //同步方法
        //to do
    }
    
    public void fun1(){
   
        synchronized (this/对象名){
    //同步代码块
            //to do
        }

当然synchronized还可以去修饰静态方法或者类本身,但是无所谓的,我们就只说这两个最常用的方式,去小探讨一下synchronized更底层一些的东西。

一.Synchronized锁住的到底是什么

都知道synchronized是通过加锁去保证线程或数据的同步,要探讨synchronized底层的东西首先得要知道synchronized到底是去锁住了什么东西?是锁住代码块?这个类?或者是对象?你要去了解synchronized去如何上锁,你至少知道是如何给什么东西上锁吧。其实我觉得同步代码块修饰的那个方式应该还是比较明了,我特意在this旁又写了一个对象名,你那括号里面填的就是相应的对象名,其实就是锁住的就是对象本身。

二.Synchronized加锁猜测

如果说我们已经明了synchronized是去给对象本身加锁,那么它是如何给对象加锁的,没研究过我们肯定不知道,但是可以肯定的是它一定是去改变了什么东西才会使对象成为一个锁住的状态,你总不可能啥也没干它自己就锁住了吧???如果学过集合类容器或者说java中也非常常用的另一个内置锁ReentrantLock,他们去改变状态的依据就是去把某个成员变量的值改变以下,类似于版本号一样,比如HashMap中有serialVersionUID,当HashMap结构发生相应的变化其值也会发生变化,ReentrantLock加锁会把相应的继承类AQS里的state变量值去用CAS机制改变,当然这里可能说的复杂了,学以致用嘛,不过不要紧,我的核心意思是就是把类里的某个成员变量当作标记,改变它的值就是改变为相应的状态,虽然synchronized是给对象本身上锁,对象的概念可能没有相应类的概念那么清晰,有成员变量有方法,但是可以肯定,它一定是去改变了对象结构里的某个标识。(但是不会真的有人觉得是把我对象相应类里的某个成员变量改变了吧,这个就很扯淡了,那程序不就乱套了,我上面那就是举个例子)

三.Java对象布局以及对象头

为了解决synchronized是对对象做了什么改变,凭什么现在A线程过来给这个对象加了锁,B线程再次加锁是不成功的,那就要去研究对象本身的结构,无可避免要聊到Java对象的布局,或者说Java对象由什么组成,我第一次听到这个问题 的时候很傻,我竟然想了个由字节码组成,这就很扯淡了,不过类本身确实就是由字节码组成的,对象本身new出来后是在堆上存储着,Java对象在内存上的结构如下:
在这里插入图片描述
这就是Java对象在堆上的实际样子,我们着重于关注那个叫对象头的部分,由Markword和Klass指针构成,我特意去查了一下官方文档对于对象头的描

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值