Java SynDemo對象如何解決繼承問題
Java SynDemo對象剛一出現的時候有很多程序員都很頭痛,其實這是完全沒有必要的,下面我們就來詳細的學習下有關的相關問題。我們發現,對于Java SynDemo對象,只有synMethord1運行了,而synMethord2卻沒有運行。
這是應為在方法級別的synchronized聲明將lock這個類對象的當前實例。所以在synMethord1運行結束unlock之前,當前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();
- }
- }
- }
- }
- }
運行程序,結果與上次相同。
如果我們希望分別同步2個方法該如何處理?可以參考這個實現:
- 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();
- }
- }
- }
- }
- }
運行程序,結果如我們預期:
- main
- synMethord2
- synMethord2
- main
- synMethord1
- main
- synMethord1
- synMethord2
關于Synchronized還有一些其他的話題,如static的問題,繼承的問題,與volatile搭配使用等等,在網上都有很詳細的說明,這里就不重復介紹了。 以上就是對Java SynDemo對象的詳細介紹。
【編輯推薦】