面试被问到的一个问题,之前没有注意这块儿的知识点。
synchronized关键字常用于静态方法、非静态方法、同步代码块,都知道它是加锁操作,那它锁住的到底是什么?
对象锁:使用对象作为锁
类锁:使用字节码文件(.class文件)作为锁。
package com.chengya.template.demo;
/**
* synchronized关键字可以作用于静态方法、非静态方法、同步代码块
*/
public class SynchronizedDemo {
/**
* 类锁
* 静态方法是通过类直接调用的
* SynchronizedDemo.method1()
*/
public static synchronized void method1(){
}
/**
* 对象锁
* 需要使用对象来调用非静态方法
* SynchronizedDemo demo = new SynchronizedDemo();
* demo.method2()
*/
public synchronized void method2(){
}
public void method3(){
// 同步代码块,使用字节码文件作为类锁
synchronized (SynchronizedDemo.class) {
}
}
public void method4(){
// 同步代码块,使用本类对象实例作为对象锁
synchronized (this) {
}
}
public void method5(Object object){
// 同步代码块,使用共享对象object作为对象锁
synchronized (object) {
}
}
}