场景是:一个订单号只能一个在付款,只能一个线程处理,不同的订单号支持并发处理
现在如果是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();
}
}
}