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

来源:互联网 发布:最新一手收藏品数据 编辑:程序博客网 时间:2024/06/05 09:45
原文地址: http://blog.csdn.net/huang_xw/article/details/7318554
/** * @Description: 两个线程(线程1与线程2)访问同一个对象的内同步方法syn *  结果: 线程1访问对象sameObj的同步方法syn()时, 线程2访问对象sameObj中的同步方法syn()阻塞. 或者线程2访问时, 线程1阻塞. *  结论: 不同线程访问同一个对象的相同同步方法时, 线程间是互斥的.  * @author snoopy * @blog http://blog.csdn.net/huang_xw */package basic.b_syn;import org.apache.log4j.Logger;import sun.management.snmp.jvminstr.JvmThreadInstanceEntryImpl.ThreadStateMap;public class TestSynB {private static Logger logger = Logger.getLogger(TestSynB.class);// 线程1static class T1 implements Runnable {TestSynB s;public T1(TestSynB sameObj) {this.s = sameObj;}// 线程1访问同步方法syn()public void run() {logger.debug("启动线程1...........");s.syn();logger.debug("退出线程1...........");}}// 线程2static class T2 implements Runnable {TestSynB s;public T2(TestSynB sameObj) {this.s = sameObj;}// 线程2访问同步方法syn()public void run() {logger.debug("启动线程2...........");s.syn();logger.debug("退出线程2...........");}}// 对象的同步方法public synchronized void syn() {String threadStr = Thread.currentThread().getName();logger.debug("▲▲▲▲▲▲" + threadStr + "开始访问同步方法");try {logger.debug(threadStr + "正在访问同步方法!!!");Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}logger.debug("▲▲▲▲▲▲" + threadStr + "退出同步方法");}public static void main(String[] args) {// 这是多线程要访问的同一个对象TestSynB sameObj = new TestSynB();// 线程1访问同步方法syn(), 线程2同样也访问同步方法syn().Thread t1 = new Thread(new T1(sameObj), "线程1");Thread t2 = new Thread(new T2(sameObj), "线程2");t1.start();t2.start();}}
执行结果:
0    [线程2] DEBUG basic.b_syn.TestSynB - 启动线程2...........0    [线程1] DEBUG basic.b_syn.TestSynB - 启动线程1...........1    [线程2] DEBUG basic.b_syn.TestSynB - ▲▲▲▲▲▲线程2开始访问同步方法1    [线程2] DEBUG basic.b_syn.TestSynB - 线程2正在访问同步方法!!!3001 [线程2] DEBUG basic.b_syn.TestSynB - ▲▲▲▲▲▲线程2退出同步方法3001 [线程1] DEBUG basic.b_syn.TestSynB - ▲▲▲▲▲▲线程1开始访问同步方法3001 [线程1] DEBUG basic.b_syn.TestSynB - 线程1正在访问同步方法!!!3001 [线程2] DEBUG basic.b_syn.TestSynB - 退出线程2...........6001 [线程1] DEBUG basic.b_syn.TestSynB - ▲▲▲▲▲▲线程1退出同步方法6001 [线程1] DEBUG basic.b_syn.TestSynB - 退出线程1...........