1. 程式人生 > 其它 >將synchronized方法與物件作為鎖——T2105

將synchronized方法與物件作為鎖——T2105

技術標籤:多執行緒多執行緒java併發程式設計thread

package 物件及變數的併發訪問2;

/**
 * 將synchronized方法與物件作為鎖
 *
 *   在methodA()方法前加入關鍵字synchronized進行同步處理,程式排隊執行,“共享”——只有共享資源的讀寫訪問才需要同步
 * 化,如果不是共享資源,那麼就沒有同步的必要了。
 *
 *   結論:
 *   1)A執行緒現持有object物件的Lock鎖,B執行緒可以以非同步的方式呼叫object物件中的非synchronized型別方法。
 *   2)A執行緒先持有object物件的Lock鎖,B執行緒如果再這時呼叫object物件中的synchronized型別的方法。則需要等待,也就是同步
 *   3)在方法宣告處新增synchronized並不是鎖方法,而是鎖當前類的物件
 *   4)在java中只有“將物件作為鎖”這種說法,並不是“鎖方法”這種說法
 *   5)在java語言中。 ”鎖“ 就是 ”物件“, ”物件“可以對映成”鎖“, 那個執行緒拿到這個把鎖,那個執行緒就可以執行這個物件中的synchronized同步方法
 *   6)如果在X物件中使用了synchronized關鍵字宣告非靜態方法,則X物件就是被當成鎖。
 *
 */
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer; /** * 測試 */ class MyObjectT215{ synchronized public void methodA(){ try { System.out.println("begin methA threadName="+Thread.currentThread().getName()); Thread.sleep(1000); System.
out.println("end"); } catch (InterruptedException e) { e.printStackTrace(); } } } class MyObjet2T215{ synchronized public void methodA2(){ try { System.out.println("begin methodA2 threadName="+Thread.currentThread().getName
()); Thread.sleep(5000); System.out.println("end endTime="+System.currentTimeMillis()); } catch (InterruptedException e) { e.printStackTrace(); } } synchronized public void methodB2(){ try { System.out.println("begin methodB2 threadName="+Thread.currentThread().getName()+" begin Time="+System.currentTimeMillis()); Thread.sleep(5000); System.out.println("end"); } catch (InterruptedException e) { e.printStackTrace(); } } } class MyThreadAT215 extends Thread{ private MyObjectT215 object; public MyThreadAT215(MyObjectT215 object){ super(); this.object=object; } @Override public void run() { super.run(); object.methodA(); } } class MyThreadA2T215 extends Thread{ private MyObjet2T215 objet2T215; public MyThreadA2T215(MyObjet2T215 objet2T215){ super(); this.objet2T215=objet2T215; } @Override public void run() { super.run(); objet2T215.methodA2(); } } class MyThreadBT215 extends Thread{ private MyObjectT215 objectT215; public MyThreadBT215(MyObjectT215 objectT215){ super(); this.objectT215=objectT215; } @Override public void run() { super.run(); objectT215.methodA(); } } class MyThreadB2T215 extends Thread{ private MyObjet2T215 objet2T215; public MyThreadB2T215(MyObjet2T215 objet2T215){ super(); this.objet2T215=objet2T215; } @Override public void run() { super.run(); objet2T215.methodB2(); } } /** * 執行 */ class RunT215{ public RunT215(){ MyObjectT215 objectT215=new MyObjectT215(); MyThreadAT215 at215=new MyThreadAT215(objectT215); at215.setName("A"); MyThreadBT215 bt215=new MyThreadBT215(objectT215); bt215.setName("B"); at215.start(); bt215.start(); } } class Run2T215{ public Run2T215(){ MyObjet2T215 objet2T215=new MyObjet2T215(); MyThreadA2T215 a2T215=new MyThreadA2T215(objet2T215); a2T215.setName("A"); MyThreadB2T215 b2T215=new MyThreadB2T215(objet2T215); b2T215.setName("B"); a2T215.start(); b2T215.start(); } } public class T2105 { public static void main(String[] args) throws InterruptedException { // RunT215 runT215=new RunT215(); Run2T215 run2T215=new Run2T215(); } }

在這裡插入圖片描述