java線程中同步線程分組問題

來源:互聯網
上載者:User

我們都知道傳統的線程同步可以通過同步代碼塊或者同步方法來實現.

那麼這裡就牽扯到同步監視器的問題.

如果對同步監視器不瞭解的擷取對線程相關知識不瞭解的, 可以查看部落格http://blog.csdn.net/johnny901114/article/details/7536951

要想確保線程之間能夠同步,那麼監視器對象對於同步線程之間來說是同一個對象,這樣才會起到同步互斥效果.

所以很多人使用位元組碼(class)最為同步對象,因為在記憶體中只存在一份某個類的位元組碼. 當然這很好,當這是對於一組同步函數而言的.

如果有多組函數呢?既然是多組,那麼就有多個同步監視器對象,如果同步監視器使用同一個類的位元組碼,那麼這樣的話就成了一組同步函數.

下面的例子有兩組同步函數頭兩個線程對print()進行同步互斥,後兩個線程對printName()進行同步互斥;也就是他們兩組是各幹各的.互不影響的.

public synchronized static void print() {//synchronized (ThreadGroup.class) {String source = "我是中國人";char[] cs = source.toCharArray();System.out.println(Thread.currentThread().getName());for (int j = 0; j < 30; j++) {System.out.println(j + " -----------------> ");for (int i = 0; i < cs.length; i++) {System.out.print(cs[i]);}System.out.println();}//}}public synchronized static void printName() {//synchronized (String.class) {System.out.println(Thread.currentThread().getName());String source = "你好嗎";char[] cs = source.toCharArray();for (int j = 0; j < 30; j++) {System.out.println(j+" -----------------> ");for (int i = 0; i < cs.length; i++) {System.out.print(cs[i]);}System.out.println();}//}}

public static void main(String[] args) {new Thread(new Runnable() {@Overridepublic void run() {print();}}).start();new Thread(new Runnable() {@Overridepublic void run() {print();}}).start();//--------------------------第二組new Thread(new Runnable() {@Overridepublic void run() {printName();}}).start();new Thread(new Runnable() {@Overridepublic void run() {printName();}}).start();}


因為print()和printName()都是static的,而且又有synchronized關鍵字修飾.所以同步監視器對象都是當前類的位元組碼.所以實際上以上只有一組同步函數.而不是兩組

從輸出結果可以看出,當一個線程執行了print()或printName()方法,其他3個線程只有等該線程執行完畢才能接著執行.

如果多組的話,一個組的同步互斥不會影響其他組的執行.

由於輸出結果較多就不粘貼了.


把print()和printName()兩個方法改成一下就是兩組同步了.

public static void print() {synchronized (ThreadGroup.class) {String source = "我是中國人";char[] cs = source.toCharArray();System.out.println(Thread.currentThread().getName());for (int j = 0; j < 30; j++) {System.out.println(j + " -----------------> ");for (int i = 0; i < cs.length; i++) {System.out.print(cs[i]);}System.out.println();}}}public static void printName() {synchronized (String.class) {System.out.println(Thread.currentThread().getName());String source = "你好嗎";char[] cs = source.toCharArray();for (int j = 0; j < 30; j++) {System.out.println(j+" -----------------> ");for (int i = 0; i < cs.length; i++) {System.out.print(cs[i]);}System.out.println();}}}

從輸出結果可以看出,兩組同步是互相交替執行的.


轉載請註明出處: http://blog.csdn.net/johnny901114/article/details/7854666

有什麼錯誤不吝指正,謝謝!



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.