同步方法锁定的是this对象

synchronized关键字可以修饰代码块、静态代码块、普通方法

当修饰代码块、静态代码块,此时的代码块就被称为同步代码块;

当修饰方法时,被称为同步方法

证明同步方法是锁定的this对象,接下来看一段代码,创建一个普通类ThisLock,其中包括两个被synchronized关键字修饰的方法,在main方法中创建此类的实例对象,并创建两个线程,分别在两个线程中调用ThisLock中的method1方法和method2方法

public class ThisLockTest {
          
   
    public static void main(String[] args) {
          
   
        ThisLock lock = new ThisLock();
        new Thread("线程1"){
          
   
            @Override
            public void run() {
          
   
                lock.method1();
            }
        }.start();

        new Thread("线程2"){
          
   
            @Override
            public void run() {
          
   
                lock.method2();
            }
        }.start();
    }
}
class ThisLock{
          
   
    public synchronized void method1(){
          
   
        System.out.println("当前线程->"+Thread.currentThread().getName());
        System.out.println(new Date(System.currentTimeMillis()));
        try {
          
   
            Thread.sleep(10_000);
        } catch (InterruptedException e) {
          
   
            e.printStackTrace();
        }
    }

    public synchronized void method2(){
          
   
        System.out.println("当前线程->"+Thread.currentThread().getName());
        System.out.println(new Date(System.currentTimeMillis()));
        try {
          
   
            Thread.sleep(10_000);
        } catch (InterruptedException e) {
          
   
            e.printStackTrace();
        }
    }
}

看一下运行结果,中间sleep10s

当前线程->线程1
Fri Jun 12 11:51:15 CST 2020
当前线程->线程2
Fri Jun 12 11:51:25 CST 2020

通过运行结果可以看出,只有当线程1执行完释放锁之后,线程2才可以执行,这也就证明synchronized关键字在修饰方法时,锁定的是this对象,同时也证明了,当线程sleep时,不会释放锁

经验分享 程序员 微信小程序 职场和发展