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锁也可以