这是我参与更文挑战的第30天,活动详情查看: 更文挑战。
上一篇文章我们花了很大的篇幅来分析理解
volatile
关键字,感兴趣的同学可以出门左转《你好,请谈谈volatile关键字?(全篇)》。讲完volatile
,当然离不开谈谈synchronized
,在并发编程中,这个关键字一直都是元老级别的存在,我们习惯于称之为重量级锁,但随着Java SE 1.6
版本后,Java
团队对synchronized
做了彻底的优化,让它具有了可轻可重,可咸可甜(乱说的)的能力。跟随我的视野,让我们来看看这到底是个啥!
一、灵魂拷问
进入正题之前,依然是俗套的灵魂拷问,你准备好了吗?
- 什么是
synchronized
,它是如何使用的? synchronized
实现对象锁的两种方式以及它的原理?- 谈谈
synchronized
锁升级过程? synchronized
与volatile
的区别?
不知道有没有难到你,下面就由石头我带大家由浅入深的分析这项技术。
二、基本应用
2.1 加锁方法
synchronized
有三种加锁方式,包括修饰静态方法、修饰实例方法、修饰代码块,不同的加锁方式影响锁的控制粒度,需要根据实际工程环境决定。
- 静态方法,作用于当前类对象,即加锁的粒度是类对象本身,进入该静态方法需获取到类对象的锁。
- 实例方法,作用于当前类的实例,即加锁的粒度是类的实例,进入该实例方法需获取到类实例的锁。
- 代码块,作用于指定锁对象,即加锁的粒度是指定的锁对象,进入该代码块需获取到指定对象的锁。
2.2 代码应用
public class SyncExample {
private static final Object LOCK = new Object();
private static int i = 1;
public synchronized static void increase1(){
i++;
}
public synchronized void increase2(){
i++;
}
public void increase3(){
synchronized (LOCK){
i++;
}
}
}
复制代码
#increase1
方法表示的是修饰静态方法;#increase2
方法表示的是修饰实例方法;#increase1
方法表示的是修饰代码块。
篇幅较长,继续阅读请点击你好,谈谈对Synchronized的理解?(二)
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END