一个关于多线程安全问题的代码,synchronized锁的应用,大家看看当中的特点

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,所以不存在冲突