java对象锁和类锁

最近发现有很多初学java 多线程基础的同学会问到对象锁和类锁会相互影响吗,本篇文章首先介绍下对象锁和类锁,然后从基础原理角度说明下具体关系。

 

对象锁(实例锁)

我们知道,类声明后,可以 new 出来很多的实例对象,每个实例在 JVM 中都有自己的引用地址和堆内存空间,这些实例都是独立的个体。很显然,在实例上加的锁和其他的实例就没有关系,互不影响了。所以使用对象锁的情况,只有使用同一实例的线程才会受锁的影响,多个实例调用同一方法也不会受影响。

通常我们使用实例锁的方式有下面三种:

1、 锁住实体里的非静态变量

2、 锁住 this 对象

3、 直接锁非静态方法

 

类锁

对象锁是用来控制实例方法之间的同步,类锁是用来控制静态方法(或静态变量互斥体)之间的同步。类锁是加载类上的,而类信息是存在 JVM 方法区的,并且整个 JVM 只有一份,方法区又是所有线程共享的,所以类锁是所有线程共享的。

使用类锁的方式有如下方式:

1、锁住类中的静态变量

因为静态变量和类信息一样也是存在方法区的并且整个 JVM 只有一份,所以加在静态变量上可以达到类锁的目的。

2、直接在静态方法上加 synchronized

因为静态方法同样也是存在方法区的并且整个 JVM 只有一份,所以加在静态方法上可以达到类锁的目的。

3、锁住 xxx.class

对当前类的 .class 属性加锁,可以实现类锁。

 

对象锁与类锁是否相互影响

我们现在来梳理下,类锁和对象锁不是同一个东西,类锁是指类的Class对象的锁,对象锁是类的实例的锁,所以他们之间不会相互影响。例如线程A访问MyClass的类锁,线程B访问MyClass的实例mc的对象锁,他们之间不会受到相互影响

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值