【幻化万千戏红尘】qianfengDay22-java基础学习:线程安全、synchronized、死锁

时间:2021-05-06 10:26:48

课程回顾:

进程:独立的应用程序
多进程
线程:进程内部的执行路径
多线程
线程的创建方式:
1、继承Thread
2、实现Runnable
用户和守护线程
优先级
线程调度
生命周期

 

今日内容:
线程安全:当多个线程操作同一数据源时,可能会引发数据安全的问题
引发线程安全的条件:
1、多线程
2、同一数据源
3、修改数据源
只有满足上述条件,才有可能会出现安全问题

避免线程安全:尽量使用局部变量,少用成员变量


synchronized ['sɪŋkrənaɪz] 互斥锁关键字,同步,主要是解决线程安全的问题
1、修饰代码块:同步代码块,出现在方法中
格式:synchronize(Object){
 可能引发安全的代码块
}
锁的存在可以保证,在任何一个时刻只能有一个线程拥有它
如果线程要为对象上锁,如果对象可以上锁,那么就上锁成功,如果对象已经上过锁,
当前线程会由运行状态进入阻塞状态,等待着对象的锁的释放


2、修饰方法:同步方法
格式:[修饰符] synchronize 返回值类型 方法名([形式参数列表])
 {
  可能引发安全的代码块
 }
修饰非静态/对象/实例方法,锁的是本类对象
修饰静态方法,锁的是类对应的Class对象

多线程:切记只有当多个线程在操作同一个锁的对象的时候,才会引起阻塞,保护数据

 

死锁:
多个线程之间相互锁住彼此需要的对象,
从而使得多个线程都进入了阻塞状态,无法参与CPU的抢夺,就照成了死锁

比如:A线程锁住资源1,等待资源2,B线程锁住资源2等待资源1,这时2个线程都会阻塞,最终带来死锁现象

所有我们在开发中,需要加大锁的粒度
就是说,我们尽量锁当前类对象,而不要去锁类内部的属性