2021年8月18日
1.sleep() 让线程休眠一会儿
2.同步代码块【处理线程之间共享资源的】【线程安全】【重点!!难点!!!】
3.守护线程
4.死锁【开发中不用,但是面试会问!!!】
5.线程的生命周期
6.线程三个重要的方法
7.生产者消费者模式
package com.qfedu.a_thread;
class MyThread1 implements Runnable {
2.同步代码块【难】
用来处理线程共享资源问题的。
共享机器:ATM机器,一个人在办理业务的时候,你进去锁门,锁住这个资源,其他人需要排队
。
厕所,三个坑位,我占着一个坑位,之后,后面得排队。如果不排队的话,
好几个人都抢到这个资源了,意味着一个坑位有好几个人在用!!!乱套了!!!!
一个坑位有好几个人在用!!!乱套了!!!!就是线程不安全的情况!!!
看电影需要买电影票:
《扫黑风暴》 【共享资源】
网络:淘票票 美团 猫眼
这里有三种订票方式。需要卖出去100张,通过三个渠道去卖这100张票,
100张票就是这三个渠道的共享资源,如果把三个渠道比作三个线程,这三个线程要去共享100张票。
卖票 ticket = 100
淘票票 第 99
美团 第99
猫眼 第99
线程的不安全性!!!
加锁!!!线程的同步
问题1:
这100张票该怎么保存,选择什么数据类型?
int 类型的数据
成员变量?创建三个线程,如果ticket是一个成员变量的话,
每一个销售线程ticket变量,ticket这个变量他就不是共享资源了。
pass
局部变量?定义在方法体内,定义在run方法中,每一次运行run方法,ticket都要重新定义一次,运行之后又销毁了,没有可持续性。
类变量?静态变量?可以
静态的成员变量,保存在数据区。可以提供给当前类对象使用,而且一处修改,处处修改!!!
package com.qfedu.a_thread;
class Sale1Ticket implements Runnable {
//这个代码是线程不安全的!!!
private static int ticket = 100;
/**
*
* synchronized的作用,只要被synchronized修饰以后,它所管辖的代码的
* 部分,要么全部执行,要么全部不执行。
* synchronized 可以修饰代码块,也可以修饰方法。
* 对代码块加锁的时候
* synchronized("锁") {
* 被锁的代码
* }
* 对方法进行加锁的时候
* synchronized(this) {
* 被锁的方法
* }
*
* */