原文地址:
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...........