多线程高并发量执行方法的过程中控制台出现:事务(进程 ID XXX)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。
可以尝试对方法加锁来解决问题。
//定义lock锁
private final ReentrantLock lock = new ReenTrantLock();
@override
public void run(){
while(true){
try{
//加锁
lock.lock();
//保证线程安全的代码
if(num > 0){
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrance();
}
System.out.println(num--);
}else{
break;
}
}finally{
//解锁
lock.unlock();
//如果同步代码有异常,要将unlock()写入finally语句块
}
}
}
加锁后看看执行是否会出现问题。线程也是鱼和熊掌不可兼得的道理,要效率不能保证安全性,要安全性不能保证效率,就是找到最合理的点来处理业务需要。