前言
最近工作有点忙,周末也一直在996加班,所以没有时间来写博客,今早忙里偷闲来写一下多线程的第二篇。
废话不多说,开始这次的主题。
复习
上一张我们学习了Java多线程的基础知识。回顾一下:
1:实现多线程的两种方式,继承Thread类以及实现Runable接口,然后重写里面的run方法即可。
2:线程的状态:
新建状态,就绪状态,运行状态,阻塞状态,死亡状态。
其中最重要的地方,也是难点就是线程的阻塞状态,线程在什么情况下会进入阻塞状态,如何解除阻塞状态。
3:线程的调度:
线程的优先级,线程睡眠,线程等待,线程让步,线程加入,线程唤醒。
这些都有相应的方法我再上一篇也都提到过。
4:线程中的常用函数:
sleep(long millis),join(),yield(),setPriority(),interrupt(),wait(),notify(),notifyAll()。
前面都讲过了,后面的interrupt(),wait(),notify(),notifyAll()这几个方法会结合今天的锁和中断来讲一下如何使用。
线程锁
首先来说说为什么要加锁。这里就要提到了共享资源这个话题,比如说:一个卖票系统,售票员有三个,总共有100张票,那么共享资源就是这100张票,有三个线程在一起消费它,当这100张票卖完时,三个线程就都得停止了。
我们都知道,线程在CPU中的机制时竞争机制,也就是说谁抢到了下一张票,谁就卖下一张票。但是要注意的是,当线程一抢到要卖的下一张票,准备抢占CPU资源运行时,线程二抢到了下一张票,并且抢到了CPU的资源,那么就会提前将下一张票卖出。这样就会导致票的顺序呗打乱。
可能我文字描述不太清楚,上一段代码看看。
class Count{
public static int count = 100;
}
@Data
class TicketThread implements Runnable{
private String name;
public TicketThread(String name){
super();
this.name = name;
}
@Override
public void run(){
int all = 1;
while (Count.count >0){
System.out.println(this.getName()+":::卖出了"+(all++)+"张,还剩"+ (--(Count.count))+"张");
}
}
}
class main{
public static void main(String[] args){
new Thread(new Ticket