同步方法锁定的是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时,不会释放锁
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
Scikit-learn实现线性回归