例子程序:異步
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(); } }
打印結果:ide
m1方法加了synchornized,是同步的,m2方法沒有加synchornized,是異步的,t一、和 t2線程雖然都執行的是MyObject的對象的方法,可是因爲m2是異步的方法,跟m1不要緊,因此直接打印出了。spa
若是將m2方法也加上synchornized修飾,此時t一、t2線程,都執行的是obj對象的方法,t1或者t2,誰先執行後,就得到了對象鎖,不釋放鎖,另外一個線程就得等着。線程