探索 Java 同步锁机制 synchronized 的原理(一)

75 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 12 天,点击查看活动详情

前言

相信写过 Java 并发程序的同学对于 synchronized 一定不陌生,我们往往采用 synchronized 来修饰同一时间只允许一个线程执行的方法。此外,synchronized 还有很多其他的用法。本篇文章,我们就一起来用例子总结下 synchronized 的用法以及 synchronized 的原理吧 !

synchronized 的基本使用

synchronized的作用主要有三个:

  • 确保线程互斥地访问同步代码
  • 保证共享变量的修改能够对线程可见
  • 有效解决重排序问题

synchronized总共有三种用法:

  • 修饰普通方法
  • 修饰静态方法
  • 修饰代码块

(1)修饰普通方法的语法如下:

public synchronized void method(){ 
    //方法内部的代码 
} 

(2)修饰静态方法的语法如下:

public synchronized static void method(){ 
    //方法内部的代码 
} 

对静态方法的同步本质上是对类的同步(静态方法本质上是属于类的方法,而不是对象上的方法)

(3)修饰代码块的语法如下:

public void method(){ 
    synchronized(this){
        //代码块内的代码
    } 
} 

synchronized 原理

synchronized 的实现原理是利用了 Java 的内置锁机制:

在 Java 中,每个对象都有一个内置锁,这个锁可以用来保证一段代码在同一时刻只能被一个线程访问。

当一个线程试图访问 synchronized 修饰的方法或代码块时,它首先会试图获取该对象的内置锁。如果该锁没有被其他线程持有,那么线程将获得锁,并执行代码。如果该锁已经被其他线程持有,那么线程将阻塞,直到该锁被释放。

我这么说可能有些抽象,具体还是得结合代码来分析这个内置锁到底长啥样?这里先卖个关子,我们下一篇文章将通过反编译的手段来分析 synchronized 的原理,且听下回分解!