java中的synchronized關鍵字

來源:互聯網
上載者:User

今天去逛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:明天開始考試,我什麼都不會。。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.