Java多线程:线程同步——实验3

原文地址: http://blog.csdn.net/huang_xw/article/details/7318554
/**
 * @Description: 两个线程(线程1与线程2)访问同一个对象的内同步方法syn1()与同步方法syn2()
 * 				 结果: 线程1访问对象sameObj的同步方法syn1()时, 线程2访问对象sameObj中的同步方法syn2()阻塞. 或者线程2访问时, 线程1阻塞.
 * 				 结论: 通常知道不同线程访问同一个对象的相同同步方法时, 线程间是互斥的. 
 *                    实际上, 不同线程访问同一个对象的不同同步方法时, 线程间也是互斥的. 
 *                    将同步方法换成同步块结论也是成立的. 关键的因素在于: 一个对象就一把锁.
 * @author snoopy
 * @blog http://blog.csdn.net/huang_xw
 */
package basic.b_syn;

import org.apache.log4j.Logger;

public class TestSynC {
	private static Logger logger = Logger.getLogger(TestSynC.class);

	// 线程1
	static class T1 implements Runnable {
		TestSynC s;

		public T1(TestSynC sameObj) {
			this.s = sameObj;
		}

		// 线程1访问同步方法1
		public void run() {
			logger.debug("启动线程1...........");
			s.syn1();
			logger.debug("退出线程1...........");
		}
	}

	// 线程2
	static class T2 implements Runnable {
		TestSynC s;

		public T2(TestSynC sameObj) {
			this.s = sameObj;
		}

		// 线程2访问同步方法2
		public void run() {
			logger.debug("启动线程2...........");
			s.Syn2();
			logger.debug("退出线程2...........");
		}
	}

	// 对象的同步方法1
	public synchronized void syn1() {
		logger.debug("▲▲▲▲▲▲线程1开始访问同步方法1");
		try {
			logger.debug("线程1正在访问同步方法1!!!");
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		logger.debug("▲▲▲▲▲▲线程1退出同步方法1");
	}

	// 对象的同步方法2
	public synchronized void Syn2() {
		logger.debug("●●●●●●线程2开始访问同步方法2");
		for (int i = 0; i < 5; i++) {
			try {
				logger.debug("线程2正在访问同步方法2!!!");
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		logger.debug("●●●●●●线程2退出同步方法2");
	}
	
	public static void main(String[] args) {
		// 这是多线程要访问的同一个对象
		TestSynC sameObj = new TestSynC();

		// 线程1访问同步方法1, 线程2同样也访问同步方法2.
		Thread t1 = new Thread(new T1(sameObj));
		Thread t2 = new Thread(new T2(sameObj));

		t1.start();
		t2.start();
	}
}
执行结果:
0    [Thread-0] DEBUG basic.b_syn.TestSynC - 启动线程1...........
1    [Thread-0] DEBUG basic.b_syn.TestSynC - ▲▲▲▲▲▲线程1开始访问同步方法1
1    [Thread-0] DEBUG basic.b_syn.TestSynC - 线程1正在访问同步方法1!!!
1    [Thread-1] DEBUG basic.b_syn.TestSynC - 启动线程2...........
3001 [Thread-0] DEBUG basic.b_syn.TestSynC - ▲▲▲▲▲▲线程1退出同步方法1
3001 [Thread-0] DEBUG basic.b_syn.TestSynC - 退出线程1...........
3001 [Thread-1] DEBUG basic.b_syn.TestSynC - ●●●●●●线程2开始访问同步方法2
3001 [Thread-1] DEBUG basic.b_syn.TestSynC - 线程2正在访问同步方法2!!!
4001 [Thread-1] DEBUG basic.b_syn.TestSynC - 线程2正在访问同步方法2!!!
5001 [Thread-1] DEBUG basic.b_syn.TestSynC - 线程2正在访问同步方法2!!!
6002 [Thread-1] DEBUG basic.b_syn.TestSynC - 线程2正在访问同步方法2!!!
7002 [Thread-1] DEBUG basic.b_syn.TestSynC - 线程2正在访问同步方法2!!!
8006 [Thread-1] DEBUG basic.b_syn.TestSynC - ●●●●●●线程2退出同步方法2
8007 [Thread-1] DEBUG basic.b_syn.TestSynC - 退出线程2...........



你可能感兴趣的:(Java多线程:线程同步——实验3)