八股文实战之JUC:静态方法的锁和普通方法的锁
1、对于staic同步方法锁住的是class类模板(Class对象) 对象是线程(调用者) 调用者只有获取资源的锁才能调用 2、普通同步方法 锁住的资源是class对象 对象是线程(调用者)即:
静态同步方法:
- 锁住的是类的
Class
对象。- 这意味着同一个类的所有静态同步方法之间是互斥的,不论是哪个实例调用这些方法。
普通同步方法:
- 锁住的是调用该方法的实例对象。
- 不同的实例可以并行执行它们的普通同步方法,因为它们各自锁住的是自己的对象。
1、锁住的东西不同可以视作不同的锁
2、进程只有获取锁 才能访问锁对应的方法等资源
3、如果锁不同 就不存在锁竞争
package com.example.mp.juc.lock8;
import java.util.concurrent.TimeUnit;
/**
* @author Mr.Lan
* @version 1.0
* @ClassName Test1$
* @description
* @date 2025/2/22 20:46
**/
public class Test1 {
/*1、对于staic同步方法锁住的是class类模板(Class对象) 对象是线程(调用者) 调用者只有获取资源的锁才能调用
* 2、普通同步方法 锁住的资源是class对象 对象是线程(调用者) * */
public static void main(String[] args) throws InterruptedException {
Phone4 phone4 = new Phone4();
Phone4 phone5 = new Phone4();
new Thread(()->{phone4.sendSms();}).start();
TimeUnit.SECONDS.sleep(1);
new Thread(()->{phone4.call();}).start();
}
}
class Phone4{
Phone4(){
}
public static synchronized void sendSms(){
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("发短信");
}
public synchronized void call(){
System.out.println("打电话");
}
}