我們都知道傳統的線程同步可以通過同步代碼塊或者同步方法來實現.
那麼這裡就牽扯到同步監視器的問題.
如果對同步監視器不瞭解的擷取對線程相關知識不瞭解的, 可以查看部落格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
有什麼錯誤不吝指正,謝謝!