synchronized 修饰静态方法、普通方法与代码块的区别

java筑基 · 2021-04-16 · 272 人浏览

https://www.jianshu.com/p/3cfdf32bd37e

https://blog.csdn.net/qq_35181209/article/details/74838690

概念:

类锁:所有对象共用一个锁

对象锁:一个对象一把锁,多个对象多把锁。

用synchronized分别修饰静态方法和非静态方法,使用的锁分别为

静态:class对象的锁

非静态:本对象的锁

实验1:对静态方法和非静态方法用synchronized进行修饰

结论:出现错乱的输出,说明静态方法和非静态方法用不同的锁

实验2:对静态方法用synchronized,非静态方法用synchronized块对 class对象加

结论:正确输出,确认静态方法确实使用class对象的锁,而非静态方法使用synchronized默认使用this锁(自己试试吧)

在Java中,synchronized是用来表示同步的,我们可以synchronized来修饰一个方法。也可以synchronized来修饰方法里面的一个语句块。

在static方法前加synchronizedstatic:静态方法属于类方法,它属于这个类,获取到的锁,是属于类的锁。 

在普通方法前加synchronizedstatic:非static方法获取到的锁,是属于当前对象的锁。 

结论:类锁和对象锁不同,他们之间不会产生互斥。