Java多線程:線程同步——實驗5

來源:互聯網
上載者:User

原文地址:
http://blog.csdn.net/huang_xw/article/details/7318554

/** * @Description: 線程1訪問安全執行緒對象StringBuffer的執行個體, 線程2要訪問時該對象則會出現阻塞現象. * @author snoopy * @blog http://blog.csdn.net/huang_xw */package basic.b_syn;import org.apache.log4j.Logger;public class TestSynE {private static Logger logger = Logger.getLogger(TestSynE.class);StringBuffer sb = new StringBuffer("初始字串+");// 線程1static class T1 implements Runnable {TestSynE s;public T1(TestSynE sameObj) {this.s = sameObj;}// 線程1存取方法syn1()public void run() {logger.debug("啟動線程1...........");s.syn1();logger.debug("退出線程1...........");}}// 線程2static class T2 implements Runnable {TestSynE s;public T2(TestSynE sameObj) {this.s = sameObj;}// 線程2存取方法syn2()public void run() {logger.debug("啟動線程2...........");s.syn2();logger.debug("退出線程2...........");}}public void syn1() {String threadStr = Thread.currentThread().getName();logger.debug("▲▲▲▲▲▲" + threadStr + "開始存取方法syn1()");try {synchronized (sb) {logger.debug(threadStr + "正在訪問對象sb");sb.append("線程1加入的字串+");// 用休眠類比一個耗時過程Thread.sleep(5000);logger.debug(threadStr + "休眠結束");logger.debug("此時字串為: " + sb.toString());}} catch (InterruptedException e) {e.printStackTrace();}logger.debug("▲▲▲▲▲▲" + threadStr + "退出方法syn1()");}public void syn2() {String threadStr = Thread.currentThread().getName();logger.debug("●●●●●●" + threadStr + "開始存取方法syn2()");sb.append("線程2加入的字串+");logger.debug("此時字串為: " + sb.toString());logger.debug("●●●●●●" + threadStr + "退出方法syn2()");}public static void main(String[] args) {// 這是多線程要訪問的同一個對象TestSynE sameObj = new TestSynE();// 線程1訪問同步方法syn1(), 線程2同樣也訪問同步方法syn2().Thread t1 = new Thread(new T1(sameObj), "線程1");Thread t2 = new Thread(new T2(sameObj), "線程2");t1.start();// sleep是為保證線程1先開始運行, 首先訪問StringBuffer的執行個體.try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}t2.start();}}

執行結果:

0    [線程1] DEBUG basic.b_syn.TestSynE - 啟動線程1...........0    [線程1] DEBUG basic.b_syn.TestSynE - ▲▲▲▲▲▲線程1開始存取方法syn1()0    [線程1] DEBUG basic.b_syn.TestSynE - 線程1正在訪問對象sb49   [線程2] DEBUG basic.b_syn.TestSynE - 啟動線程2...........49   [線程2] DEBUG basic.b_syn.TestSynE - ●●●●●●線程2開始存取方法syn2()5000 [線程1] DEBUG basic.b_syn.TestSynE - 線程1休眠結束5001 [線程1] DEBUG basic.b_syn.TestSynE - 此時字串為: 初始字串+線程1加入的字串+5001 [線程1] DEBUG basic.b_syn.TestSynE - ▲▲▲▲▲▲線程1退出方法syn1()5001 [線程2] DEBUG basic.b_syn.TestSynE - 此時字串為: 初始字串+線程1加入的字串+線程2加入的字串+5001 [線程1] DEBUG basic.b_syn.TestSynE - 退出線程1...........5001 [線程2] DEBUG basic.b_syn.TestSynE - ●●●●●●線程2退出方法syn2()5001 [線程2] DEBUG basic.b_syn.TestSynE - 退出線程2...........

相關文章

聯繫我們

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