關於一次自動轉單出現的併發問題的解決:前端
package autoTransfer; import java.util.Scanner; /** * Created by cuijunyong on 2018/6/27. */ public class TestMain { private static AutoTransfer autoTransfer = new AutoTransfer(); private static Scanner cin = new Scanner(System.in); public static void main(String[] args) { // String a = cin.next(); // String b = cin.next(); // String c = cin.next(); new MyThread("123").start(); new MyThread("123").start(); new MyThread(new String("123")).start(); } } class MyThread extends Thread{ private String customerId; private static AutoTransfer autoTransfer = new AutoTransfer(); @Override public void run() { try { autoTransfer.run(customerId); } catch (Exception e) { e.printStackTrace(); } } public MyThread(String customerId) { this.customerId = customerId; } }
package autoTransfer; /** * Created by cuijunyong on 2018/6/27. */ public class AutoTransfer{ public void run(String customerId) throws Exception{ synchronized (customerId){ System.out.println(Thread.currentThread() + "自動轉單開始customerId=" + customerId + " hashCode=" + customerId.hashCode() + "真正內存地址=" + System.identityHashCode(customerId)); Thread.sleep(5000); System.out.println(Thread.currentThread() + "自動轉單結束customerId=" + customerId + " hashCode=" + customerId.hashCode() + "真正內存地址=" + System.identityHashCode(customerId)); } } }
這個簡單一點的解決方案能夠直接synchronized(customerId.intern())java
package autoTransfer; import java.util.Scanner; /** * Created by cuijunyong on 2018/6/27. */ public class TestMain { private static AutoTransfer autoTransfer = new AutoTransfer(); private static Scanner cin = new Scanner(System.in); public static void main(String[] args) { // String a = cin.next(); // String b = cin.next(); // String c = cin.next(); new MyThread("123").start(); new MyThread("123").start(); new MyThread(new String("123")).start(); } } class MyThread extends Thread{ private String customerId; private static AutoTransfer autoTransfer = new AutoTransfer(); @Override public void run() { try { autoTransfer.run(customerId); } catch (Exception e) { e.printStackTrace(); } } public MyThread(String customerId) { this.customerId = customerId; } }
package autoTransfer; import java.util.concurrent.ConcurrentHashMap; /** * Created by cuijunyong on 2018/6/27. */ public class AutoTransfer{ private ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>(); public void run(String customerId) throws Exception{ if(map.put(customerId, 1) != null){ return; } try { System.out.println(Thread.currentThread() + "自動轉單開始customerId=" + customerId + " hashCode=" + customerId.hashCode() + "真正內存地址=" + System.identityHashCode(customerId)); Thread.sleep(5000); System.out.println(Thread.currentThread() + "自動轉單結束customerId=" + customerId + " hashCode=" + customerId.hashCode() + "真正內存地址=" + System.identityHashCode(customerId)); }finally { map.remove(customerId); } } }