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.一个方法写成静态, 一个不静态, 都加锁, 由两个类调用同一个对象的两个方法, 不互斥, 证明静态与非静态方法不共用锁:
总结:
- 静态方法的锁属于类, 一个类中所有加锁的静态方法共用该锁
- 非静态方法的锁属于对象, 一个对象中所有加锁的非静态方法共用, 和静态方法的锁不同而互不相干
- 加锁的方法的执行不会影响同一个类/对象中未加锁的方法的执行