Synchronized 修饰静态方法和非静态方法 ,对象锁和类锁的区别
Synchronized 修饰非静态方法的锁,其实是属于当前对象的锁,属于对象锁
Synchronized 修饰静态方法的锁,其实是属于当前类,属于类锁 ,类锁是一个抽象概念,为了区别对象锁
测试得出结论:
package com.citydo.dataengine.config.scheduled;
/**
* @Author:yuess
* @Description:
* @Date:Create in 16:11
* @Modified By:
*/
public class Test {
synchronized static void fun1() throws InterruptedException {
System.out.println("加锁的方法1开始执行");
Thread.sleep(2000);
System.out.println("加锁的方法1执行结束");
}
synchronized static void fun2() throws InterruptedException {
System.out.println("加锁的方法2开始执行");
Thread.sleep(2000);
System.out.println("加锁的方法2执行结束");
}
public static void main(String[] args) {
Test obj1=new Test();
Test obj2=new Test();
new Thread(() -> {
try {
obj1.fun1();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
new Thread(() -> {
try {
obj1.fun2();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}
1.两个线程执行同一个对象的不同加锁非静态方法, 互斥执行
2.同一对象加锁方法不影响不加锁的方法
3.两个线程执行两个对象的加锁方法, 不互斥, 证明不同对象不共用非静态锁:
4.两个线程分别执行该类两个对象的静态加锁方法, 互斥执行, 证明与对象无关
5.一个方法写成静态, 一个不静态, 都加锁, 由两个类调用同一个对象的两个方法, 不互斥, 证明静态与非静态方法不共用锁:
总结:
- 静态方法的锁属于类, 一个类中所有加锁的静态方法共用该锁
- 非静态方法的锁属于对象, 一个对象中所有加锁的非静态方法共用, 和静态方法的锁不同而互不相干
- 加锁的方法的执行不会影响同一个类/对象中未加锁的方法的执行