对象锁的同步和异步
例子程序:
package com.lhy.thread01; /** * 对象锁的同步和异步问题 * @author dev */ public class MyObject { //synchronized public synchronized void m1(){ try { System.err.println(Thread.currentThread().getName()); Thread.sleep(4000); } catch (InterruptedException e) { e.printStackTrace(); } } //synchronized public void m2(){ try { System.err.println(Thread.currentThread().getName()); Thread.sleep(4000); } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) { final MyObject obj = new MyObject(); /** * 分析: * t1线程先持有obj对象的Lock锁,t2线程可以以异步的方式调用对象中的非synchornized修饰的方法 * t1线程先持有obj对象的Lock锁,t2线程如果在这个时候调用对象中的同步(synchornized)方法则需等待,也就是同步 */ Thread t1 = new Thread(new Runnable() { @Override public void run() { obj.m1(); } },"t1"); Thread t2 = new Thread(new Runnable() { @Override public void run() { obj.m2(); } },"t2"); t1.start(); t2.start(); } }
打印结果:
m1方法加了synchornized,是同步的,m2方法没有加synchornized,是异步的,t1、和 t2线程虽然都执行的是MyObject的对象的方法,但是由于m2是异步的方法,跟m1没关系,所以直接打印出了。
如果将m2方法也加上synchornized修饰,此时t1、t2线程,都执行的是obj对象的方法,t1或者t2,谁先执行后,就获得了对象锁,不释放锁,另一个线程就得等着。