當調用一個對象的非靜态的synchronized方法時,鎖定的是對象本身;
當調用一個對象的靜态的synchronized方法時,鎖定的是對象所屬的類的class對象(在方法區中)
示例如下:
package cn.edu.tju;
public class JvmLockTest {
public static void main(String[] args) {
MyClass myClass = new MyClass();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
myClass.func1();
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
myClass.func2();
}
});
t1.start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t2.start();
}
}
class MyClass {
public synchronized void func1(){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("in func1......");
}
public static synchronized void func2(){
System.out.println("in func2......");
}
}
輸出:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yM5gDN1kTZmRmYwYDZ2QWZyYzXwADMyMDM2AzLchDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)