问题描述
- 高手请进!!!---线程安全问题,怎么解决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();
}
}
}
时间: 2024-08-18 02:11:41