同步方法中加static与不加static的区别 、类锁

本文介绍了Java中synchronized锁在有无static修饰时的不同情况。无static时,synchronized默认锁对象为this,同一对象调用不同同步方法,先拿到锁的线程先结束;有static时,被修饰的同步方法是类锁,无论创建多少对象,先拿到类锁的线程先执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

同步方法中加static与不加static的区别

无static时

在不加static时候 ,synchronized默认的锁对象为 this,也就是调用该方法的那个对象,对于同一个对象调用的不同的同步方法,无论如何休眠,先执行结束的都是 先拿到锁的那个线程


```java
public class Test_1{
    public static void main(String[] args) throws InterruptedException {
        A a=new A();
         new Thread(()->{a.a();},"A").start();
        TimeUnit.SECONDS.sleep(1);
        new Thread(()->{a.b();},"B").start();
	 //虽然a方法休眠了4s 但是调用对象就只有一个a对象,线程A先拿到的锁,所以A线程先执行完,  B线程再执行。
    }
    
}
class A{
    public synchronized  void a(){
    //在方法上加synchronized  等价于方法里的同步代码块synchronized(this){xxx}  
        try {
            TimeUnit.SECONDS.sleep(4);
            System.out.println("a");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
        }
    }

    public synchronized  void b(){
        System.out.println("b");
    }
}

有static 时 类锁

因为 static 是在类加载的时候就加载 (可以理解为:类初始化的时候,synchronized锁也跟着一起初始化了,所以无论创建多少个对象,只有一个synchronized锁被初始化),所以 被static修饰的同步 方法就是那个类本身,也就是类锁 ,类 只有一个,无论我们创建几个对象去调用这个同步方法,都是先拿到类锁的那一个线程先执行



```java
public class Test_1{
    public static void main(String[] args) throws InterruptedException {
        A a=new A();
        A b=new A();
        new Thread(()->{a.a();},"A").start();
        TimeUnit.SECONDS.sleep(1);
        new Thread(()->{b.b();},"B").start();
		// 结果为 线程A先执行完,再是线程B,因为这里的锁
		//是类锁,被线程A的 a对象获取了 ,所以B线程的b对象 要等待
    }
    
}
class A{
    public static synchronized  void a(){
        try {
            TimeUnit.SECONDS.sleep(4);
            System.out.println("a");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static synchronized  void b(){
        System.out.println("b");
    }
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值