哈喽伙伴们大家好,我是公差~
我们在开发学习的过程中,使用锁是一件很频繁的事情,那么,什么是类锁?什么是对象锁呢?
首先我们在对象内部定义一个锁方法:
class Student {
public synchronized void sendA() {
System.out.println("sendA");
}
}
这只是一个普通的加锁方法,我们在使用对象内部的这个方法时,通常是这样使用的,这是我们最经常使用的调用对象内部方法的模式。
Student stu = new Student();
stu.sendA();
这里使用的就是对象锁。为什么呢?
我们需要看一下虚拟机内部加载clas对象的过程:
通过加载图可以看到,我们在new对象之后,获得的是class的实例对象,那么我们使用的也就是实例对象的锁。
那什么是类锁呢?
我们日常写的方法是分为静态方法和非静态方法的。
我们使用的对象锁,就是非静态的synchronized方法。
那类锁就是静态的synchronized方法吗?答案是是的。
class Student {
public static synchronized void synchronized sendB() {
System.out.println("sendB");
}
}
Student stu = new Student();
stu.sendB();
我们在new一个对象的时候,都是通过我们手动配置的class对象文件来获取一个个不同的对象。但是,我们在new对象的时候,内部的静态synchronized方法锁的都是当前类的class对象
在我们使用锁的过程中,需要注意以下几点:
1、当一个线程试图访问同步代码时,它首先必须得到锁,正常退出或者抛出异常时必须释放锁。所有的普通同步方法用的都是同一把锁——>实例对象本身,就是new出来的具体实例对象本身,本类this。也就是说,如果一个实例对象的普通方法获取锁后,该实例对象的其它普通同步方法必须等待获取锁的方法释放后才能获取锁。
2、所有的静态同步方法用的也是同一把锁——类对象本身,就是唯一模板class。
3、具体实例对象this和唯一模板class,这两把锁是两个不同的对象,所以静态同步方法与普通同步方法之间是不会有静态条件的,但是一旦一个静态同步方法获取锁后,其它的静态同步方法都必须等待该方法释放锁后才能获取锁。
扫一扫获取最新资讯哦
原文章地址:https://mp.weixin.qq.com/s/GR3ZQxl1XzkbQwZvmQC0HA