原文地址:
http://blog.csdn.net/huang_xw/article/details/7318554
/** * @Description: 兩個線程(線程1與線程2)訪問同一個類的靜態同步方法syn() * 結果: 線程1訪問對象sameObj1的靜態同步方法syn()時, 線程2訪問對象sameObj2中的靜態同步方法syn()阻塞. 或者線程2訪問時, 線程1阻塞. * 結論: 不同線程訪問同一個類的靜態同步方法時, 線程間是互斥的. * @author snoopy * @blog http://blog.csdn.net/huang_xw */package basic.b_syn;import org.apache.log4j.Logger;public class TestSynD {private static Logger logger = Logger.getLogger(TestSynD.class);// 線程1static class T1 implements Runnable {TestSynD s;public T1(TestSynD sameObj) {this.s = sameObj;}// 線程1訪問靜態同步方法public void run() {logger.debug("啟動線程1...........");TestSynD.syn();logger.debug("退出線程1...........");}}// 線程2static class T2 implements Runnable {TestSynD s;public T2(TestSynD sameObj) {this.s = sameObj;}// 線程2訪問靜態同步方法public void run() {logger.debug("啟動線程2...........");TestSynD.syn();logger.debug("退出線程2...........");}}// 對象的靜態同步方法public static synchronized void syn() {String threadStr = Thread.currentThread().getName();logger.debug("▲▲▲▲▲▲" + threadStr + "開始訪問靜態同步方法");try {logger.debug(threadStr + "正在靜態訪問同步方法syn()!!!");Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}logger.debug("▲▲▲▲▲▲" + threadStr + "退出靜態同步方法");}public static void main(String[] args) {// 這是多線程要訪問的同一個對象TestSynD sameObj1 = new TestSynD();TestSynD sameObj2 = new TestSynD();// 線程1,線程2訪問靜態同步方法Thread t1 = new Thread(new T1(sameObj1));Thread t2 = new Thread(new T2(sameObj2));t1.start();t2.start();}}
執行結果:
0 [Thread-0] DEBUG basic.b_syn.TestSynD - 啟動線程1...........0 [Thread-1] DEBUG basic.b_syn.TestSynD - 啟動線程2...........1 [Thread-0] DEBUG basic.b_syn.TestSynD - ▲▲▲▲▲▲Thread-0開始訪問靜態同步方法1 [Thread-0] DEBUG basic.b_syn.TestSynD - Thread-0正在靜態訪問同步方法syn()!!!3001 [Thread-0] DEBUG basic.b_syn.TestSynD - ▲▲▲▲▲▲Thread-0退出靜態同步方法3001 [Thread-1] DEBUG basic.b_syn.TestSynD - ▲▲▲▲▲▲Thread-1開始訪問靜態同步方法3001 [Thread-1] DEBUG basic.b_syn.TestSynD - Thread-1正在靜態訪問同步方法syn()!!!3001 [Thread-0] DEBUG basic.b_syn.TestSynD - 退出線程1...........6002 [Thread-1] DEBUG basic.b_syn.TestSynD - ▲▲▲▲▲▲Thread-1退出靜態同步方法6002 [Thread-1] DEBUG basic.b_syn.TestSynD - 退出線程2...........