今天去逛javaworld.com.tw看到有人在問線程同步的問題,最近對多線程高度興趣,寫了不少類似的程式,所以線程同步也是肯定要用的到的,synchronized加在函數名稱中間,我記得是對對象的同步,也就是說多線程如果想保持同步,必須保證這些線程用的是一個對象。看到過synchronized寫到函數裡面的,但是沒得感受,今天測試了一把,把synchronized寫到函數內部的,就不用保證一個對象了,所有的N個不同對象都可以。這個是代碼看下吧。
先來個synchronized寫到函數內部的
/**<br /> *<br /> */<br />package com.baseramework.core.thread;</p><p>/**<br /> * 線程測試<br /> *<br /> * @author sunyanan<br /> *<br /> */<br />public class ThreadTest {</p><p>public static void main(String[] args) {<br />Thread t1 = new Thread(new ExecuteThread());<br />Thread t2 = new Thread(new ExecuteThread());<br />t1.start();<br />t2.start();<br />}<br />}</p><p>/**<br /> * 任務類,來類比我們的任務<br /> *<br /> * @author sunyanan<br /> *<br /> */<br />class TaskClass {</p><p>private TaskClass(){};</p><p>private static TaskClass t = new TaskClass();</p><p>public static TaskClass getInstance() {<br />return t;<br />}</p><p>public synchronized void printData() {<br />System.out.print(Thread.currentThread().getName() + ":");<br />for(int i = 0; i < 100; i++) {<br />System.out.print(i + " ");<br />}<br />System.out.println();<br />}</p><p>}</p><p>/**<br /> * 線程類<br /> * @author sunyanan<br /> *<br /> */<br />class ExecuteThread implements Runnable {<br />TaskClass t = TaskClass.getInstance();<br />@Override<br />public void run() {<br />t.printData();<br />}</p><p>}<br />
運行結果:
可以看到2個線程是同步的來了,
再來看一下關鍵字寫到內部的:
/**<br /> *<br /> */<br />package com.baseramework.core.thread;</p><p>/**<br /> * 線程測試<br /> *<br /> * @author sunyanan<br /> *<br /> */<br />public class ThreadTest {</p><p>public static void main(String[] args) {<br />Thread t1 = new Thread(new ExecuteThread());<br />Thread t2 = new Thread(new ExecuteThread());<br />t1.start();<br />t2.start();<br />}<br />}</p><p>/**<br /> * 任務類,來類比我們的任務<br /> *<br /> * @author sunyanan<br /> *<br /> */<br />class TaskClass {</p><p>public void printData() {<br />synchronized (TaskClass.class) {<br />System.out.print(Thread.currentThread().getName() + ":");<br />for (int i = 0; i < 100; i++) {<br />System.out.print(i + " ");<br />}<br />System.out.println();<br />}<br />}</p><p>}</p><p>/**<br /> * 線程類<br /> * @author sunyanan<br /> *<br /> */<br />class ExecuteThread implements Runnable {<br />TaskClass t = new TaskClass();<br />@Override<br />public void run() {<br />t.printData();<br />}</p><p>}<br />
運行結果是和上面一樣的,我就不多了。
再來對比下,關鍵字寫到函式宣告處,但是非一個對象的時候的代碼:
/**<br /> *<br /> */<br />package com.baseramework.core.thread;</p><p>/**<br /> * 線程測試<br /> *<br /> * @author sunyanan<br /> *<br /> */<br />public class ThreadTest {</p><p>public static void main(String[] args) {<br />Thread t1 = new Thread(new ExecuteThread());<br />Thread t2 = new Thread(new ExecuteThread());<br />t1.start();<br />t2.start();<br />}<br />}</p><p>/**<br /> * 任務類,來類比我們的任務<br /> *<br /> * @author sunyanan<br /> *<br /> */<br />class TaskClass {</p><p>public synchronized void printData() {<br />System.out.print(Thread.currentThread().getName() + ":");<br />for(int i = 0; i < 100; i++) {<br />System.out.print(i + " ");<br />}<br />System.out.println();<br />}</p><p>}</p><p>/**<br /> * 線程類<br /> * @author sunyanan<br /> *<br /> */<br />class ExecuteThread implements Runnable {<br />TaskClass t = new TaskClass();<br />@Override<br />public void run() {<br />t.printData();<br />}</p><p>}<br />
來看下結果:
可以看到是沒有同步的哈。這樣已經很清楚了,同步到底雜用的了。。
PS:明天開始考試,我什麼都不會。。