2 jielinvsx jielinvsx 于 2014.07.19 14:18 提问

高手请进!!!---线程安全问题,怎么解决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();
        }
    }
}

}

3个回答

u012576250
u012576250   2014.07.19 16:33

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

u200817992
u200817992   2014.07.20 21:44

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

blackstreet
blackstreet   2014.07.22 18:19

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();
}
}
}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!