高手请进!!!---线程安全问题,怎么解决new String 问题

场景是:一个订单号只能一个在付款,只能一个线程处理,不同的订单号支持并发处理

现在如果是new String("20140719140818");就有问题怎么解决

如果不是new出来的,什么情况会出现问题

public class Test {

public static void main(String[] args) {
    new Thread(){
        public void run(){
            pay("20140719140818");
        }
    }.start();
    new Thread(){
        public void run(){
            pay("20140719140818");
        }
    }.start();
    new Thread(){
        public void run(){
            pay("20140719140818");
        }
    }.start();
}

public static void pay(String serNo){
    synchronized (serNo) {
        System.out.println(Thread.currentThread().getName() + "," + name);
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

}

你的pay(String str);这个方法中是有比较语句,如果有的话,我估计你用的是str==....,把==改成str.equals("....")

String s="" 和 new String("")是不一样,new String("")即使字符串值相同在虚拟机也是不同的对象。
synchronized (serNo) {}锁住的serNo对象,不同的serNo对象多线程自然会有问题。


public synchronized static void pay
方法加上synchronized 就行了

或者这样
private static Object lock= new Object();
public static void pay(String serNo){
synchronized (lock) {
System.out.println(Thread.currentThread().getName() + "," );
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}