java 加鎖方法:
1:直接加
synchronized 關鍵字
2:使用lock
private java.util.concurrent.locks.Lock lock = new ReentrantLock();
private void fun(){
lock.lock();
try{
執行語句......
} finally{
lock.unlock();
}
}
例子:
生成訂單號,此處是由時間戳
public class Tools {
private static int count = 0;
//單臺服務器,多個線程 同時生成訂單號
public static String getNumber() {
//區分不同的訂單號
try {
Thread.sleep(300);
} catch (Exception e) { // TODO: handle exception
}
SimpleDateFormat simpt = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
return simpt.format(new Date()) + "-" + ++count; //時間戳後面加了 count
}
}
開啓100個線程調用之:
public class ordersService implements Runnable { private Tools orderNumGenerator = new Tools(); //定義成全局 public void run(){ getNumber(); } public synchronized void getNumber(){ String number=orderNumGenerator.getNumber(); System.out.println(Thread.currentThread().getName()+"num"+number); } public static void main(String[] args){ ordersService ordersService=new ordersService(); for (int i=0;i<100;i++){ new Thread(ordersService).start(); } } }
結果:
多個線程共享區同一個全局變量,線程安全問題
解決方法就是加鎖
一:使用關鍵字加鎖
或者使用 lock鎖也可以