监测一个类里面有两个synchronized方法是否可以同步执行
public class SychronizedMethod { public synchronized void test1() { System.out.println("test1 entry"); System.out.println("test1 out"); } public synchronized void test2() { System.out.println("test2 entry"); try { Thread.sleep(10000); } catch (InterruptedException ex) { ex.printStackTrace(); } System.out.println("test2 out"); } public static void main(String[] args) { SychronizedMethod sychronizedMethod = new SychronizedMethod(); WorkHandler handler = new WorkHandler(sychronizedMethod); WorkHandler1 handler1 = new WorkHandler1(sychronizedMethod); Thread t1 = new Thread(handler); Thread t2 = new Thread(handler1); t1.start(); t2.start(); } } public class WorkHandler1 implements Runnable { private SychronizedMethod syn; WorkHandler1(SychronizedMethod syn) { this.syn = syn; } @Override public void run() { syn.test1(); } } public class WorkHandler implements Runnable { private SychronizedMethod syn; WorkHandler(SychronizedMethod syn) { this.syn = syn; } @Override public void run() { syn.test2(); } }
结果:
test2 entry
test2 out
test1 entry
test1 out
结论:jvm在执行方法以前,如果发现该方法前面有对象的synchronized关键字,就现在该对象的ID上加锁,当其他线程执行同时执行这个方法时,会检测改对象ID上是否加锁,如果加锁时就等待锁释放。 所以两个synchronized方法要排队。
浙公网安备 33010602011771号