线程同步
多个线程操作同一个资源
并发:同一个对象被多个线程同时操作
☑️线程同步就是一种等待机制,多个需要同时访问此对象的线程进入这个对象的等待池形成队列,等待前面线程使用完毕,下一个线程再使用。
⚖️**锁机制:**当一个县城获得对象的排它锁,独占资源,其他线程必须等待,使用后释放即可,存在以下问题:
- 一个线程持有锁会导致其他所有需要此锁的线程挂起;
- 在多线程竞争下,加锁,释放锁会导致比较多的上下文切换和调度延时,引起性能问题;
- 如果一个优先级高的线程等待一个优先级低的线程释放锁,会导致优先级倒置,引起性能问题;
经典案例–>买票
package Review.多线程.syn;
import java.nio.channels.InterruptedByTimeoutException;
/**
* @author 吴某人
* @PackageName:Review.多线程.syn
* @ClassName:UnsafeBuyTicket
* @Description:
* @date 2021/2/2 0002 16:40
*/
public class UnsafeBuyTicket {
public static void main(String[] args) {
BuyTicket station = new BuyTicket();
new Thread(station,"张三").start();
new Thread(station,"李四").start();
new Thread(station,"王五").start();
}
}
class BuyTicket implements Runnable{
//票
private int ticketNums = 100;
//使用标识符,让线程外部停止
boolean flag = true;
@Override
public void run() {
//买票
while (flag){
try {
//模拟延时
Thread.sleep(100);
buy();
} catch (InterruptedByTimeoutException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private synchronized void buy() throws InterruptedByTimeoutException, InterruptedException {
//判断是否有票
if (ticketNums<1){
flag = false;
return;
}
//买票
System.out.println(Thread.currentThread().getName()+"拿到"+ticketNums--);
}
}