开启掘金成长之旅!这是我参与「掘金日新计划 · 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 的原理,且听下回分解!