锁的是当前对象,我们可以通过实验证明
将某个类中的两个方法分别用synchronized来修饰,然后new出两个线程分别调用该类的两个方法,其中一个方法会使得调用它的线程sleep 10秒,若另一个线程调用的另一个方法在前一个线程sleep完10秒后才能执行,则可以证明synchronized修饰方法时,锁的是当前对象
public class Test {
public synchronized void func1() {
System.out.println("func1!");
try {
Thread.sleep(10000);
System.out.println("sleep time over!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void func2() {
System.out.println("func2!");
}
public static void main(String[] args) {
Test test = new Test();
Thread t1 = new Thread(() -> {
test.func1();
}, "t1");
Thread t2 = new Thread(() -> {
test.func2();
}, "t2");
t1.start();
t2.start();
}
}
执行结果: