public class TestDemo{
public static void main(String[] args) {
final SyncDemo4 s = new SyncDemo4();
//final SyncDemo4 s1 = new SyncDemo4();
Thread t1 = new Thread(){
public void run(){
s.methodA();
}
};
Thread t2 = new Thread(){
public void run(){
s1.methodB();
}
};
t1.start();
t2.start();
}
public synchronized static void methodA(){
Thread t = Thread.currentThread();
try{
System.out.println(t+"SA开始排队!");
Thread.sleep(2000);
System.out.println(t+"SA排队完毕!!!");
}catch(Exception e){
}
}
public synchronized void methodB(){
Thread t = Thread.currentThread();
try{
System.out.println(t+"SB开始排队!");
Thread.sleep(2000);
System.out.println(t+"SB排队完毕!!!");
}catch(Exception e){
}
}
}
//大家看一下,为什么synchronized锁定了对象s,但是为什么t1和t2线程start的时候
t1和t2是并发执行的?按道理来说当t1执行methodA时,对象s应该就被锁定了,t2线程应该不能执行methodB,而是处于被阻塞的状态,等到t1执行完毕的时候才能够解除锁定。 但是结果是同步运行,。 另外大家注意一下,methodA是static方法,
http://langgufu.iteye.com/blog/2152608
很简单啊,因为你的methodA和methodB的锁定不相同啊,methodA是静态方法,锁是当前类型TestDemo.class,而methodB的锁是this对象,所以不存在线程问题。
要想两个线程之间有明显的竞争关系,必须要有锁竞争才行。
你的代码没有SyncDemo4类,稍微修改了下代码,让两个方法都为静态,或者都为非静态的话,两个方法的锁才会相同,才能看到明显的等待过程。
实例代码如下:
public class TestDemo {
public static void main(String[] args) {
final TestDemo s = new TestDemo();
Thread t1 = new Thread() {
public void run() {
s.methodA();
}
};
Thread t2 = new Thread() {
public void run() {
s.methodB();
}
};
t1.start();
t2.start();
}
public synchronized void methodA() {
Thread t = Thread.currentThread();
try {
System.out.println(t + "SA开始排队!");
Thread.sleep(2000);
System.out.println(t + "SA排队完毕!!!");
} catch (Exception e) {
}
}
public synchronized void methodB() {
Thread t = Thread.currentThread();
try {
System.out.println(t + "SB开始排队!");
Thread.sleep(2000);
System.out.println(t + "SB排队完毕!!!");
} catch (Exception e) {
}
}
}
测试结果,可以看到两个线程有明显的操作间的等待现象。
嗯嗯 ,是的 ,你的回答很正确,确实之前是疏忽了,静态方法上synchronized锁,锁的是TestDemo类,另外一个锁的是this,所以不存在冲突