当多个线程并发访问同一个资源的时候(对象、方法、代码块),经常会出现不安全的现象。
那么如何解决线程安全问题?
加锁:可以保证多个线程串行执行,即不要相互争夺抢占资源
通俗的理解:有一个卫生间,a和b两个人去上卫生间。如果a正在使用,则加一把锁,表示正在使 用。
synchronized:给共享资源加锁
一、加锁的形式
1、给方法加锁
语法:public synchornized 返回值 方法名(){....}
public synchornized void sell(){
if(tickets>0){
tickets--;
System.out.println(Thread.currentThread().getName()+tickets)
}
}
2、给代码块加锁
语法:synchronized(任意对象){}
public synchronized void sell(){
synchronized(this){
if(tickets>0){
tickets--;
System.out.println(Thread.currentThread().getName())
}
}
}
3、解锁:解锁的时机是以下任意一个条件
(1)正常解锁:将synchronized修饰的方法、代码块执行完毕
(2)异常解锁:如果synchronized修饰的方法出现了异常,则会自动解锁
二、死锁
会严重造成系统资源的损耗,浪费空间。
产生死锁的根本原因:
1、系统资源不足
2、多线程的执行顺序不合理;算法问题
解决死锁:1、银行家算法 2、避免产生死锁的四个必要条件