Java SynDemo對象如何解決繼承問題
Java SynDemo對象剛一出現(xiàn)的時候有很多程序員都很頭痛,其實這是完全沒有必要的,下面我們就來詳細(xì)的學(xué)習(xí)下有關(guān)的相關(guān)問題。我們發(fā)現(xiàn),對于Java SynDemo對象,只有synMethord1運行了,而synMethord2卻沒有運行。
這是應(yīng)為在方法級別的synchronized聲明將lock這個類對象的當(dāng)前實例。所以在synMethord1運行結(jié)束unlock之前,當(dāng)前Java SynDemo對象實例是無法運行synMethord2的。這種方法級別的synchronized聲明和以下的做法是等同的:
- package com.cnblogs.gpcuster;/** * * @author Aaron.Guo * */
- public class SynDemo { public void synMethord1() {
synchronized (this) { while (true) { try { Thread.sleep(1000);
System.out.println("synMethord1"); } catch (InterruptedException
e) { // TODO Auto-generated catch block- e.printStackTrace();
- }
- }
- }
- }
- public void synMethord2() { synchronized (this) { while (true)
{ try { Thread.sleep(1000); System.out.println("synMethord2"); }
catch (InterruptedException e) { // TODO Auto-generated catch block- e.printStackTrace();
- }
- }
- }
- }
- }
運行程序,結(jié)果與上次相同。
如果我們希望分別同步2個方法該如何處理?可以參考這個實現(xiàn):
- package com.cnblogs.gpcuster;/** * * @author Aaron.Guo * */
- public class SynDemo { private Object flag1 = new Object();
private Object flag2 = new Object(); public void synMethord1()
{ synchronized (flag1) { while (true) { try { Thread.sleep(1000);
System.out.println("synMethord1"); } catch (Interrupted
Exception e) { // TODO Auto-generated catch block- e.printStackTrace();
- }
- }
- }
- }
- public void synMethord2() { synchronized (flag2) { while (true)
{ try { Thread.sleep(1000); System.out.println("synMethord2"); }
catch (InterruptedException e) { // TODO Auto-generated catch block- e.printStackTrace();
- }
- }
- }
- }
- }
運行程序,結(jié)果如我們預(yù)期:
- main
- synMethord2
- synMethord2
- main
- synMethord1
- main
- synMethord1
- synMethord2
關(guān)于Synchronized還有一些其他的話題,如static的問題,繼承的問題,與volatile搭配使用等等,在網(wǎng)上都有很詳細(xì)的說明,這里就不重復(fù)介紹了。 以上就是對Java SynDemo對象的詳細(xì)介紹。
【編輯推薦】