原文地址: http://blog.youkuaiyun.com/huang_xw/article/details/7318554
/**
* @Description: 两个线程(线程1与线程2)访问同一个对象的内同步方法syn()与非同步方法nonsyn()
* 结果: 线程1访问对象sameObj的同步方法时, 线程2可以同时访问对象sameObj的非同步方法.
* @author snoopy
* @blog http://blog.youkuaiyun.com/huang_xw
*/
package basic.b_syn;
import org.apache.log4j.Logger;
public class TestSynA {
private static Logger logger = Logger.getLogger(TestSynA.class);
// 线程1
static class T1 implements Runnable {
TestSynA s;
public T1(TestSynA sameObj) {
this.s = sameObj;
}
// 线程1访问同步方法
public void run() {
logger.debug("启动线程1...........");
s.syn();
logger.debug("退出线程1...........");
}
}
// 线程2
static class T2 implements Runnable {
TestSynA s;
public T2(TestSynA sameObj) {
this.s = sameObj;
}
// 线程2访问非同步方法
public void run() {
logger.debug("启动线程2...........");
s.nonSyn();
logger.debug("退出线程2...........");
}
}
// 对象的同步方法
public synchronized void syn() {
logger.debug("▲▲▲▲▲▲线程1开始访问同步方法");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
logger.debug("▲▲▲▲▲▲线程1退出同步方法");
}
// 对象的非同步方法
public void nonSyn() {
logger.debug("●●●●●●线程2开始访问非同步方法");
for (int i = 0; i < 5; i++) {
try {
logger.debug("线程2正在访问非同步方法!!!");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
logger.debug("●●●●●●线程2退出非同步方法");
}
public static void main(String[] args) {
// 这是多线程要访问的同一个对象
TestSynA sameObj = new TestSynA();
// 线程1访问同步方法, 线程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.TestSynA - 启动线程1...........
0 [Thread-1] DEBUG basic.b_syn.TestSynA - 启动线程2...........
1 [Thread-0] DEBUG basic.b_syn.TestSynA - ▲▲▲▲▲▲线程1开始访问同步方法
1 [Thread-1] DEBUG basic.b_syn.TestSynA - ●●●●●●线程2开始访问非同步方法
1 [Thread-1] DEBUG basic.b_syn.TestSynA - 线程2正在访问非同步方法!!!
1001 [Thread-1] DEBUG basic.b_syn.TestSynA - 线程2正在访问非同步方法!!!
2001 [Thread-1] DEBUG basic.b_syn.TestSynA - 线程2正在访问非同步方法!!!
3001 [Thread-1] DEBUG basic.b_syn.TestSynA - 线程2正在访问非同步方法!!!
3001 [Thread-0] DEBUG basic.b_syn.TestSynA - ▲▲▲▲▲▲线程1退出同步方法
3001 [Thread-0] DEBUG basic.b_syn.TestSynA - 退出线程1...........
4001 [Thread-1] DEBUG basic.b_syn.TestSynA - 线程2正在访问非同步方法!!!
5001 [Thread-1] DEBUG basic.b_syn.TestSynA - ●●●●●●线程2退出非同步方法
5001 [Thread-1] DEBUG basic.b_syn.TestSynA - 退出线程2...........