Java锁Synchronized不同用法的区别

本文深入探讨了Java中Synchronized锁的用法及其对线程安全的保障作用。包括锁的原子性和可见性特性,以及如何通过对象锁和类锁实现多线程环境下的资源同步。同时,详细解析了锁在不同场景下的应用,如方法级锁和代码块级锁,并讨论了锁的互斥性。

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

一、Synchronized锁用法示例:

synchronized用处是什么?
synchronized保证了线程的原子性。(一个线程在执行被保护的代码块时,没有任何线程会同时访问)
synchronized还保证了可见性。(当执行完synchronized之后,修改后的变量对其他的线程是可见的)
Java中的synchronized,通过使用内置锁,来实现对变量的同步操作,进而实现了对变量操作的原子性和其他线程对变量的可见性,从而确保了并发情况下的线程安全。

1)加在方法上:

非静态方法:public synchronized void test(){...}
静态方法: public static synchronized void test2(){...}

2)加在代码锁

类锁

public void test(){
    ...
    synchronized (ObjLockTest.class){
        ...
    }
    ...
}

对象锁

public void test2(){
    ...
    synchronized (this){
        ...
    }
    ...
}

对象所

public void test3(){
    ...

   A a = new A();
    synchronized (a){
        ...
    }
    ...
}

二、Synchronized锁从被拥有者角度而言,分为对象锁与类锁;

1)Synchronized修饰非静态方法,或非静态方法中的代码块,或指定对象时,锁为对象锁;对象锁是属于当前对象的;

2)Synchronized修饰静态方法,或静态方法中的代码块,或指定对象为XXX.class时,锁为类锁;类锁是属于class的,是这个类的所有对象及class共用的一把锁;

 

一个对象只有一把对象锁及一把类锁:

1)多个线程都需要同一对象的对象锁时(注:可能是调用同一个方法,也可能是调用不同的方法来获取锁),只有一个线程能拿到锁,其他线程都需等待;

2)多个线程都需要多个对象的类锁时(注:可能是调用同一个方法,也可能是调用不同的方法来获取锁),只有一个线程能拿到锁,其他线程都需等待;

3)而2个线程,一个需要对象锁,一个需要类锁时,即使同时发生也不会相互影响(注:此结论本人通过代码测试证明是2个锁,不互斥的);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值